简体   繁体   English

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

[英]MySQL: Cannot delete or update a parent row: a foreign key constraint fails

Hi i am trying to make simple database with 2 tables, first for user information, and second for their uploads, because it's project for faculty, i have some assignments... And one is to use foreign key. 嗨,我正在尝试使用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

Anybody now where is the probel and how could i fix it? 现在有人在哪里探子,我该如何解决? It also doesn't work on sqlfiddle when i insert some values for testing. 当我插入一些测试值时,它在sqlfiddle上也不起作用。 Thanks :) 谢谢 :)

You have child record and so since you have put the ON DELETE RESTRICT as well as ON UPDATE RESTRICT constraints(I mean as they are default ) whatever changes you make on the parent row ie a row in korisnici table with child rows in slike table will be restricted by MySQL . 你有孩子记录等,因为你已经把ON DELETE RESTRICTON UPDATE RESTRICT约束(我的意思是,他们是默认的 ),你就父行即行korisnici表与S形表子行的任何更改将受MySQL限制。

Now for deletion you can do something like this: 现在要删除,您可以执行以下操作:

  • Either change the ON DELETE constraint to CASCADE ... OR ... ON DELETE约束更改为CASCADE ...或...
  • Use the following query to delete the record: 使用以下查询删除记录:

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

    And for Updation... 为了更新...

  • Either change the ON UPDATE constraint to CASCADE ... OR ... ON UPDATE约束更改为CASCADE ...或...
  • Or else you'll have to write extra database end program (like PL-SQL) in which you will have to take the backup of the child record and then update the parent record and then again insert the child record as per the new updation you have done in the parent record. 否则,您将不得不编写额外的数据库终端程序(例如PL-SQL),在该程序中,您将必须备份子记录,然后更新父记录,然后根据您的新更新再次插入子记录。已在父记录中完成。

    Anyways the better option always is to mention the appropriate foeign constraints while specifying or establishing the foreign key. 无论如何,更好的选择总是在指定或建立外键时提及适当的严格约束。

    To get bit more info you can refer this link 要获取更多信息,您可以参考此链接

  • I think the error message is actually misleading. 我认为错误消息实际上是令人误解的。 What I see from your code is that it is the insert into SLIKE that fails because UserID=2 does not match the UserID of the previous insert into KORISNICI. 我从您的代码中看到的是,由于UserID = 2与先前插入KORISNICI的UserID不匹配,因此SLIKE的插入失败。

    There's really no point to choose ON DELETE CASCADE . 选择ON DELETE CASCADE确实没有意义。 So the alternative would be to allow the foreign key to be NULL and then choose ON DELETE SET NULL . 因此,替代方法是允许外键为NULL ,然后选择ON DELETE SET NULL

    Personally I would use " ON UPDATE CASCADE " pared with " ON DELETE SET NULL " to avoid unnecessary complications, but on your set up you may want a different approach. 我个人将“ ON UPDATE CASCADE ”与“ ON DELETE SET NULL ”相对应,以避免不必要的复杂性,但是在您进行设置时,您可能需要其他方法。

    Hope this helps. 希望这可以帮助。

    声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

     
    粤ICP备18138465号  © 2020-2024 STACKOOM.COM