mysql中的外键引用问题

时间:2012-05-18 12:15:22

标签: php mysql database zend-framework

我有一个名为mail的表,其中一个名为deletedBy的外键列通过pk引用users表。当我创建一个新邮件时,我想将此字段设置为null,因为邮件未被删除,但是当我这样做时,我得到一个外键约束失败错误。

我完全理解错误,但我如何解决它?

表: -

CREATE TABLE `mail` (
  `pk` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `from` int(11) unsigned NOT NULL,
  `to` int(11) unsigned NOT NULL,
  `subject` varchar(255) NOT NULL,
  `message` text NOT NULL,
  `dt` datetime NOT NULL,
  `read` enum('0','1') NOT NULL DEFAULT '0',
  `deletedby` int(11) unsigned DEFAULT '0',
  PRIMARY KEY (`pk`),
  KEY `from_mail__users_pk` (`from`),
  KEY `to_mail__users_pk` (`to`),
  KEY `deletedby_mail__users_pk` (`deletedby`),
  CONSTRAINT `deletedby_mail__users_pk` FOREIGN KEY (`deletedby`) REFERENCES `user` (`pk`) ON DELETE NO ACTION ON UPDATE NO ACTION,
  CONSTRAINT `from_mail__users_pk` FOREIGN KEY (`from`) REFERENCES `user` (`pk`) ON DELETE NO ACTION ON UPDATE NO ACTION,
  CONSTRAINT `to_mail__users_pk` FOREIGN KEY (`to`) REFERENCES `user` (`pk`) ON DELETE NO ACTION ON UPDATE NO ACTION
) ENGINE=InnoDB AUTO_INCREMENT=8 DEFAULT CHARSET=utf8 COLLATE=utf8_bin

错误消息: -

 ERROR 1452: Cannot add or update a child row: a foreign key constraint fails (`ajfit`.`mail`, CONSTRAINT `deletedby_mail__users_pk` FOREIGN KEY (`deletedby`) REFERENCES `user` (`pk`) ON DELETE NO ACTION ON UPDATE NO ACTION)
SQL Statement:
 INSERT INTO `ajfit`.`mail` (`from`, `to`, `subject`, `message`, `read`) VALUES (31, 30, 'test', 'test', '0')

由于

安德鲁

3 个答案:

答案 0 :(得分:4)

由于您没有为deletedby提供值,因此使用了DEFAULT的{​​{1}}值。但是(假设)0表中没有user为0的记录,因此外键约束(正确)失败。

正如您自己所说,您希望pk的{​​{1}}值为deletedby,以便在提供替代值之前不会检查外键约束:

DEFAULT

答案 1 :(得分:2)

mail表中的deletedby列应该包含user表中id列的值,因为user表的id列上有外键。

由于外键约束接受NULL值,一种方法是在mail表中插入新行时为deletedby列设置NULL值。

答案 2 :(得分:1)

用户表中是否有一个附加了代码0的条目?因为我看起来就是那张桌子试图找到条目0而没有运气。