摘要:在本教程中,您将学习如何在 MySQL 中禁用外键约束检查。
有时,禁用外键检查非常有用。例如,您可以在禁用外键约束检查的情况下以任意顺序将数据加载到父表和子表。如果不禁用外键检查,则必须先将数据加载到父表中,然后按顺序加载到子表中,这可能会很繁琐。
您想要禁用外键检查的另一种情况是当您想要删除表时。除非禁用外键检查,否则无法删除外键约束引用的表。
要禁用外键检查,请将foreign_key_checks
变量设置为零,如下所示:
SET foreign_key_checks = 0;
Code language: SQL (Structured Query Language) (sql)
要重新启用外键约束检查,请将foreign_key_checks
的值设置为1:
SET foreign_key_checks = 1;
Code language: SQL (Structured Query Language) (sql)
请注意,将foreign_key_checks
设置为1 不会触发对现有表数据的任何验证。换句话说,MySQL不会验证外键检查禁用期间添加的数据的一致性。
禁用外键检查示例
首先,创建一个名为countries
的新表:
CREATE TABLE countries(
country_id INT AUTO_INCREMENT,
country_name VARCHAR(255) NOT NULL,
PRIMARY KEY(country_id)
) ENGINE=InnoDB;
Code language: SQL (Structured Query Language) (sql)
其次,创建另一个名为cities
的表:
CREATE TABLE cities(
city_id INT AUTO_INCREMENT,
city_name VARCHAR(255) NOT NULL,
country_id INT NOT NULL,
PRIMARY KEY(city_id),
FOREIGN KEY(country_id)
REFERENCES countries(country_id)
)ENGINE=InnoDB;
Code language: SQL (Structured Query Language) (sql)
表cities
有一个外键约束,该外键约束引用表countries
的列country_id
。
第三,在cities
表中插入一个新行:
INSERT INTO cities(city_name, country_id)
VALUES('New York',1);
Code language: SQL (Structured Query Language) (sql)
MySQL 发出以下错误:
Error Code: 1452. Cannot add or update a child row: a foreign key constraint fails (`classicmodels`.`cities`, CONSTRAINT `cities_ibfk_1` FOREIGN KEY (`country_id`) REFERENCES `countries` (`country_id`))
Code language: JavaScript (javascript)
四、禁用外键检查:
SET foreign_key_checks = 0;
Code language: SQL (Structured Query Language) (sql)
第五,在cities
表中插入一个新行:
INSERT INTO cities(city_name, country_id)
VALUES('New York',1);
Code language: SQL (Structured Query Language) (sql)
这次由于外键检查被禁用, INSERT
语句执行成功。
以下查询返回表cities
的内容:
SELECT * FROM cities;
Code language: SQL (Structured Query Language) (sql)

六、重新启用外键约束检查:
SET foreign_key_checks = 1;
Code language: SQL (Structured Query Language) (sql)
当外键检查重新启用时,MySQL 不会重新验证表中的数据。但是,它不允许您插入或更新违反外键约束的数据。
最后,在countries
表中插入一行,该行的country_id
列的值为1,以使两个表中的数据一致:
INSERT INTO countries(country_id, country_name)
VALUES(1,'USA');
Code language: SQL (Structured Query Language) (sql)
删除具有外键约束的表
假设您要删除countries
和cities
表。
首先,删除表countries
:
DROP TABLE countries;
Code language: SQL (Structured Query Language) (sql)
MySQL 发出此错误:
Error Code: 3730. Cannot drop table 'countries' referenced by a foreign key constraint 'cities_ibfk_1' on table 'cities'.
Code language: JavaScript (javascript)
要解决此问题,您有两种选择:
- 首先删除表
cities
,然后删除表countries
。 - 禁用外键检查并以任何顺序删除表。
我们将演示第二种方法,即在删除表之前禁用外键约束检查。
其次,禁用外键检查:
SET foreign_key_checks = 0;
Code language: SQL (Structured Query Language) (sql)
第三,删除表countries
和cities
:
DROP TABLE countries;
DROP TABLE cities;
Code language: SQL (Structured Query Language) (sql)
两条语句均成功执行。
最后,启用外键检查:
SET foreign_key_checks = 1;
Code language: SQL (Structured Query Language) (sql)
在本教程中,您学习了如何使用SET foreign_key_checks = 0
禁用 MySQL 中的外键检查。