Skip to main content

如何在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;

MySQL Disable Foreign Key Checks example

第六,重新启用外键约束检查:

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中禁用外键检查。