如何在MySQL中禁用外键约束检查
有时,禁用外键检查非常有用。例如,在禁用外键约束检查的情况下,可以按任意顺序将数据加载到父表和子表。如果不禁用外键检查,则必须先将数据加载到父表中,然后依次加载到子表中,这可能会很繁琐。
要禁用外键检查的另一种情况是,要删除一个表。除非禁用外键检查,否则无法删除外键约束引用的表。
要禁用外键检查,请将foreign_key_checks变量设置为零,如下所示:
SET foreign_key_checks = 0;
要重新启用外键约束检查,请将外键检查的值设置为1:
SET foreign_key_checks = 1;
请注意,将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;
其次,创建另一个名为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;
表cities有一个外键约束,它引用表countries的列country_id。
第三,在cities表中插入新行:
INSERT INTO cities(city_name, country_id)
VALUES('New York',1);
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`))
第四,禁用外键检查:
SET foreign_key_checks = 0;
第五,在cities表中插入新行:
INSERT INTO cities(city_name, country_id)
VALUES('New York',1);
这一次,由于禁用了外键检查,INSERT语句成功执行。
以下查询返回表cities的内容:
SELECT * FROM cities;
第六,重新启用外键约束检查:
SET foreign_key_checks = 1;
当重新启用外键检查时,MySQL没有重新验证表中的数据。但是,它不允许您插入或更新违反外键约束的数据。
最后,在country_id列中的值为1的countries表中插入一行,以使两个表中的数据一致:
INSERT INTO countries(country_id, country_name)
VALUES(1,'USA');
删除具有外键约束的表
假设您想要删除国家和城市表。
首先,把桌子放在以下国家:
DROP TABLE countries;
MySQL发布了以下错误:
Error Code: 3730. Cannot drop table 'countries' referenced by a foreign key constraint 'cities_ibfk_1' on table 'cities'.
要解决此问题,您有两个选项:
我们将演示在删除表之前禁用外键约束检查的第二种方法。
第二,禁用外键检查:
SET foreign_key_checks = 0;
第三,删除国家和城市的表格:
DROP TABLE countries;
DROP TABLE cities;
两条语句都成功执行。
最后,启用外键检查:
SET foreign_key_checks = 1;
在本教程中,您学习了如何使用SET foreign_key_checks=0在MySQL中禁用外键检查。