1

我有一个名为 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')

谢谢

安德鲁

4

3 回答 3

4

因为您没有提供 的值deletedby,所以使用的DEFAULT0。但是(可能)user表中没有 apk为 0 的记录,因此外键约束(正确)失败。

正如您自己所说,您希望deletedby有一个DEFAULT值,NULL以便在提供替代值之前不检查外键约束:

ALTER TABLE mail MODIFY deletedby int(11) unsigned DEFAULT NULL;
于 2012-05-18T12:18:13.547 回答
2

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

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

于 2012-09-03T09:07:39.050 回答
1

用户表中是否有附加代码 0 的条目?因为在我看来,该表试图找到条目 0 却没有运气。

于 2012-05-18T12:19:24.170 回答