【问题标题】:MySQL: Cannot delete or update a parent row: a foreign key constraint failsMySQL:无法删除或更新父行:外键约束失败
【发布时间】:2014-09-06 05:32:33
【问题描述】:

您好,我正在尝试使用 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 1217 (23000) at line 14: Cannot delete or update a parent row: a foreign key constraint fails

现在有人在哪里,我该如何修复它?当我插入一些值进行测试时,它也不适用于 sqlfiddle。 谢谢:)

【问题讨论】:

    标签: mysql sql foreign-keys constraints parent


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

      您有子记录,因此由于您设置了 ON DELETE RESTRICT 以及 ON UPDATE RESTRICT 约束(我的意思是它们是 default i>) 您对父行所做的任何更改,即 korisnici 表中的一行以及 slike 表中的子行都将受到 MySQL 的限制我>

      现在要删除,您可以执行以下操作:

    • 要么将 ON DELETE 约束更改为 CASCADE ... OR ...
    • 使用以下查询删除记录:
      DELETE FROM `slike` WHERE `UserID`=`<UserId you want to delete>`;
      DELETE FROM `korisnici` WHERE `UserID`=`<UserId you want to delete>`;
      

      为了更新...

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

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

      要获得更多信息,您可以参考this link
    • 【讨论】:

      • ALTER TABLE slike ADD FOREIGN KEY (UserID) REFERENCES korisnici (UserID) ON DELETE CASCADE ON UPDATE CASCADE;只是?我这样做了,但仍然不起作用:(
      【解决方案3】:

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

      我个人会使用“ON UPDATE CASCADE”与“ON DELETE SET NULL”来避免不必要的并发症,但在您的设置中,您可能需要不同的方法.

      希望这会有所帮助。

      【讨论】:

        猜你喜欢
        • 2017-09-15
        • 2021-11-13
        • 1970-01-01
        • 2017-06-11
        • 1970-01-01
        • 2019-05-25
        • 2014-11-11
        • 2018-05-12
        相关资源
        最近更新 更多