我有一个由包含列表(物种)的表组成的 sql 文件,然后是引用该表的主表(动物),例如:
DROP TABLE IF EXISTS `tbl_species`;
CREATE TABLE `tbl_species` (
specie VARCHAR(10) PRIMARY KEY
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
INSERT INTO `tbl_species` VALUES ('dog');
INSERT INTO `tbl_species` VALUES ('cat');
INSERT INTO `tbl_species` VALUES ('bird');
DROP TABLE IF EXISTS `tbl_animal`;
CREATE TABLE `tbl_animal` (
id_animal INTEGER NOT NULL PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(25) NOT NULL DEFAULT "no nombre",
specie VARCHAR(10) NOT NULL DEFAULT "dog",
FOREIGN KEY (specie) REFERENCES `tbl_species` (specie),
CONSTRAINT `uc_Info_Animal` UNIQUE (`id_animal`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=1;
这适用于 sqlfiddle没问题,但是当我在服务器上执行 sql 文件时 我收到以下错误:
Cannot delete or update a parent row: a foreign key constraint fails
Statement:
DROP TABLE IF EXISTS `tbl_species`
你能告诉我如何解决这个问题吗,目前我必须删除数据库并重新创建它...所以删除语句导致问题...
最佳答案
您收到 Cannot delete or update
错误的原因是 tbl_animal
表已经存在。需要按照与创建相反的顺序删除表:
DROP TABLE IF EXISTS `tbl_animal`;
DROP TABLE IF EXISTS `tbl_species`;
CREATE TABLE `tbl_species` (
specie VARCHAR(10) PRIMARY KEY
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
INSERT INTO `tbl_species` VALUES ('dog');
INSERT INTO `tbl_species` VALUES ('cat');
INSERT INTO `tbl_species` VALUES ('bird');
CREATE TABLE `tbl_animal` (
id_animal INTEGER NOT NULL PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(25) NOT NULL DEFAULT "no nombre",
specie VARCHAR(10) NOT NULL DEFAULT "dog",
FOREIGN KEY (specie) REFERENCES `tbl_species` (specie),
CONSTRAINT `uc_Info_Animal` UNIQUE (`id_animal`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=1;
或者,您可以在命令前加上:
SET FOREIGN_KEY_CHECKS=0;
这将禁用当前 session 的外键检查。
要重新启用外键检查,请在之后添加以下命令:
SET FOREIGN_KEY_CHECKS=1;
请参阅 http://sqlfiddle.com/#!2/b6727 中的工作示例
关于mysql - 重置数据库无法删除或更新父行 : a foreign key constraint fails,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15887745/