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

时间:2014-09-06 05:32:34

标签: mysql sql foreign-keys constraints parent

您好我正在尝试使用2个表创建简单的数据库,首先是用户信息,第二个用于上传,因为它是教师的项目,我有一些任务......还有一个是使用外键

DROP TABLE IF EXISTS `korisnici`;

CREATE TABLE `korisnici` (
  `UserID` INT(11) NOT NULL AUTO_INCREMENT,
  `username` VARCHAR(12) NOT NULL,
  `password` VARCHAR(32) NOT NULL,
  `email` VARCHAR(32) NOT NULL,
  `telefon` VARCHAR(16) NOT NULL,
  PRIMARY KEY (`UserID`)
);

DROP TABLE IF EXISTS `slike`;

CREATE TABLE `slike` (
  `id` INT(11) NOT NULL AUTO_INCREMENT,
  `name` VARCHAR(200) NOT NULL,
  `size` INTEGER(11) NOT NULL,
  `type` VARCHAR(200) NULL,
  `file_path` VARCHAR(200) NOT NULL,
  `username` VARCHAR(12) NOT NULL,
  `naslov` VARCHAR(32) NOT NULL,
  `adresa` VARCHAR(80) NOT NULL,
  `opis` VARCHAR(1200) NOT NULL,
  `datum` DATE NOT NULL,
  `UserID` INTEGER(11) NOT NULL,
  PRIMARY KEY (`id`)
);

ALTER TABLE `slike` ADD FOREIGN KEY (UserID) REFERENCES `korisnici` (`UserID`);


-- ALTER TABLE `korisnici` ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin;
-- ALTER TABLE `slike` ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin;



-- ---
-- Test Data
-- ---

INSERT INTO `korisnici` (`UserID`,`username`,`password`,`email`,`telefon`) VALUES('1','dd','d','d','d');
INSERT INTO `slike` (`id`,`name`,`size`,`type`,`file_path`,`username`,`naslov`,`adresa`,`opis`,`datum`,`UserID`) VALUES('2','a','122','png','ksks/sss','dsss','aaaa','sss','ssss','2014/09/04','2');

ERROR:

ERROR 1217 (23000) at line 14: Cannot delete or update a parent row: a foreign key constraint fails

现在有人在哪里问题,我该如何解决?当我插入一些测试值时,它也无法在sqlfiddle上工作。 谢谢:))

3 个答案:

答案 0 :(得分:1)

你有子记录,因为你已经把 ON DELETE RESTRICT 以及 ON UPDATE RESTRICT 约束(我的意思是因为它们是默认 i>)您在父行上所做的任何更改,即 sor 表中的行中 slike 表中的子行将受 MySQL 的。

现在删除你可以这样做:

  • ON DELETE 约束更改为 CASCADE ...或...
  • 使用以下查询删除记录:

    DELETE FROM `slike` WHERE `UserID`=`<UserId you want to delete>`;
    DELETE FROM `korisnici` WHERE `UserID`=`<UserId you want to delete>`;
    

    对于更新......

  • ON UPDATE 约束更改为 CASCADE ...或...
  • 否则您必须编写额外的数据库结束程序(如PL-SQL),您必须在其中备份子记录,然后更新父记录,然后再次插入根据您在父记录中完成的新更新,子记录。

    无论如何,更好的选择总是在指定或建立外键时提及适当的限制。

    要获得更多信息,您可以参考this link

  • 答案 1 :(得分:1)

    我认为错误信息实际上是误导性的。我从你的代码中看到的是,SLIKE中的插入失败了,因为UserID = 2与前一个插入到KORISNICI中的UserID不匹配。

    答案 2 :(得分:0)

    选择 ON DELETE CASCADE 真的没有意义。因此,替代方法是允许外键为 NULL ,然后选择 ON DELETE SET NULL

    我个人会使用&#34; ON UPDATE CASCADE &#34;与&#34; ON DELETE SET NULL &#34;相比较为避免不必要的复杂情况,但在您的设置中,您可能需要采用不同的方法。

    希望这有帮助。