0

我有这两张桌子...

CREATE TABLE `Mail` (
`timestamp` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
`sender` varchar(255) NOT NULL DEFAULT '',
`receiver` varchar(255) NOT NULL DEFAULT '',
`text` longtext ,
PRIMARY KEY (`timestamp`,`sender`,`receiver`)
) 
ENGINE=InnoDB DEFAULT CHARSET=utf8;

... 和 ...

CREATE TABLE `MailHeader` (
`timestamp` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
`sender` varchar(255) NOT NULL DEFAULT '',
`receiver` varchar(255) NOT NULL DEFAULT '',
`title` varchar(45) DEFAULT NULL,,
`seen` int(11) DEFAULT '0', 
`reply` int(11) DEFAULT '0',    
PRIMARY KEY (`timestamp`, `sender`, `receiver`),
CONSTRAINT `MailHeader_ibfk_1` FOREIGN KEY (
   `timestamp`, `sender`, `receiver`) REFERENCES 
   `Mail` (`timestamp`, `sender`, `receiver`)
) 
ENGINE=InnoDB DEFAULT CHARSET=utf8;

当我尝试像这样更新非键列时:

UPDATE MailHeader 
SET `title` = ?, `seen` = ?, `reply` = ? 
WHERE `sender` = ? and `receiver` = ?;

比我总是得到那个错误:

com.mysql.jdbc.exceptions.MySQLIntegrityConstraintViolationException:

无法添加或更新子行:外键约束失败 ( usr_web4930_1. MailHeader, CONSTRAINT MailHeader_ibfk_1 FOREIGN KEY ( timestamp, sender, receiver) REFERENCES Mail( timestamp, sender, receiver)

我尝试了最简单的方法,在两个表中都有一条记录,并使用“MySQL-Workbench”工具来更改非键列。有完全相同的错误。我真的不明白...

4

1 回答 1

0

正如您所发现的,您不仅在更新非关键列。该ON UPDATE CURRENT_TIMESTAMP属性还将更新timestamp列,该列是外键的一部分。

删除该属性将解决实际问题。但你也应该做更多的改变:

DEFAULT CURRENT_TIMESTAMP从表中删除MailHeader,因为您总是希望从父表中插入正确的时间戳。

ON UPDATE CURRENT_TIMESTAMP从表中删除Mail,以避免在您想要更新行时出现同样的问题。如果您从不更新,那么您也不需要该属性。

更进一步,我建议使用AUTO_INCREMENT PRIMARY KEY.

也不清楚为什么你需要这张MailHeader桌子。您也可以将列添加到表title中。(我想没有标题的邮件就不可能存在。)seenreplyMail

于 2018-06-10T20:31:25.107 回答