MySQL 禁用外键检查

在本教程中,您将学习如何在 MySQL 中禁用外键约束检查。

摘要:在本教程中,您将学习如何在 MySQL 中禁用外键约束检查。

有时,禁用外键检查非常有用。例如,您可以在禁用外键约束检查的情况下以任何顺序将数据加载到父表和子表。如果不禁用外键检查,则必须先将数据加载到父表中,然后依次加载子表,这可能很乏味。

您要禁用外键检查的另一种情况是当您要删除表时。除非禁用外键检查,否则不能删除外键约束引用的表。

要禁用外键检查,请将 foreign_key_checks 变量设置为零,如下所示:

SET foreign_key_checks = 0;

要重新启用外键约束检查,请将 的值设置 foreign_key_checks 为 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 具有引用 country_id 表列的外键约束 countries 。

第三,在表中插入一个新行 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 禁用外键检查实例

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

SET foreign_key_checks = 1;

当外键检查重新启用时,MySQL 没有重新验证表中的数据。但是,它不允许您插入或更新违反外键约束的数据。

最后,在 countries 表中插入一行,其列中的 country_id 值为1,使两个表中的数据保持一致:

INSERT INTO countries(country_id, country_name)
VALUES(1,'USA');

删除具有外键约束的表

假设您要删除 countries 和 cities 表。

首先,删除表 countries :

DROP TABLE countries;

MySQL 发出此错误:

Error Code: 3730. Cannot drop table 'countries' referenced by a foreign key constraint 'cities_ibfk_1' on table 'cities'.

要解决此问题,您有两个选择:

  • 先放下表 cities ,然后移除表 countries 。
  • 以任何顺序禁用外键检查和删除表。

我们将演示在删除表之前禁用外键约束检查的第二种方法。

二、禁用外键检查:

SET foreign_key_checks = 0;

第三,删除两个表 countries 和 cities :

DROP TABLE countries;
DROP TABLE cities;

两个语句都成功执行。

最后,启用外键检查:

SET foreign_key_checks = 1;

在本教程中,您学习了如何使用 SET foreign_key_checks = 0 禁用 MySQL 中的外键检查。