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语句会导致问题......
您收到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上的工作示例