我有那两张table。。。
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
,约束 MailHeader_ibfk_1
外键( timestamp
, sender
, receiver
)参考文献 Mail
( timestamp
, sender
, receiver
)
我尝试了最简单的方法,在两个表中都有一条记录,并使用“mysql workbench”工具更改非键列。同样的错误。我真的不明白。。。
1条答案
按热度按时间iecba09b1#
正如您所发现的,您不仅要更新非键列。这个
ON UPDATE CURRENT_TIMESTAMP
属性还将更新timestamp
列,它是外键的一部分。删除该属性将解决实际问题。但你也应该做更多的改变:
删除
DEFAULT CURRENT_TIMESTAMP
从MailHeader
表,因为您总是希望从父表插入正确的时间戳。删除
ON UPDATE CURRENT_TIMESTAMP
从Mail
表,以避免更新行时出现相同的问题。如果从不更新,那么也不需要该属性。我建议用一个
AUTO_INCREMENT PRIMARY KEY
.也不清楚你为什么需要
MailHeader
一张table也没有。您也可以添加列title
,seen
以及reply
到Mail
table(我想没有邮件头的邮件是不可能存在的。)