reset database无法删除或更新父行:外键约束失败

cMi*_*nor 0 mysql reference foreign-keys

我有一个由包含列表(种类)的表组成的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;
Run Code Online (Sandbox Code Playgroud)

这在sqlfiddle上工作没有问题,但是当我在服务器上执行sql文件时,我收到以下错误:

Cannot delete or update a parent row: a foreign key constraint fails
Statement:
DROP TABLE IF EXISTS `tbl_species`
Run Code Online (Sandbox Code Playgroud)

你能否告诉我如何解决这个问题,目前我必须删除数据库并重新创建...所以drop语句会导致问题......

Ros*_* II 5

您收到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;
Run Code Online (Sandbox Code Playgroud)

或者,您可以在命令前加上:

SET FOREIGN_KEY_CHECKS=0;
Run Code Online (Sandbox Code Playgroud)

这将禁用当前会话的外键检查.

要重新启用外键检查,请在以后添加以下命令:

SET FOREIGN_KEY_CHECKS=1;
Run Code Online (Sandbox Code Playgroud)

请参阅http://sqlfiddle.com/#!2/b6727上的工作示例