删除具有外键约束的表

假设您要删除国家和城市表。

首先,删除表格国家:

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

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;

其次,创建另一个名为城市的表:

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;

表城市具有一个外键约束,该约束引用表国家的列country_id。

第三,在citys表中插入新行:

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;

第五,在citys表中插入新行:

INSERT INTO cities(city_name, country_id)
VALUES('New York',1);

这次由于禁用了外键检查,INSERT语句成功执行。

以下查询返回表城市的内容:

SELECT * FROM cities;

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

SET foreign_key_checks = 1;

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

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

INSERT INTO countries(country_id, country_name)
VALUES(1,'USA');
日期:2019-11-20 08:52:12 来源:oir作者:oir