我有那两张表...
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
( 参考文献timestamp
,sender
,receiver
(
我尝试了最简单的方法,两个表中都有一条记录,并使用"MySQL-Workbench"工具来更改非键列。具有完全相同的错误。 我真的不明白...
正如您所发现的,您不仅在更新非键列。ON UPDATE CURRENT_TIMESTAMP
属性还将更新作为外键一部分的timestamp
列。
删除该属性将解决实际问题。但您还应该进行更多更改:
从MailHeader
表中删除DEFAULT CURRENT_TIMESTAMP
,因为您始终希望从父表中插入正确的时间戳。
从Mail
表中删除ON UPDATE CURRENT_TIMESTAMP
,以避免在要更新行时出现相同的问题。如果您从不更新,那么您也不需要该属性。
更远,我建议使用AUTO_INCREMENT PRIMARY KEY
.
也不清楚为什么你需要MailHeader
表。您也可以将列title
、seen
和reply
添加到Mail
表中。(我想没有标题的邮件就不能存在。