sql错误1452

xmd2e60i  于 2021-06-21  发布在  Mysql
关注(0)|答案(1)|浏览(251)

我有那两张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”工具更改非键列。同样的错误。我真的不明白。。。

iecba09b

iecba09b1#

正如您所发现的,您不仅要更新非键列。这个 ON UPDATE CURRENT_TIMESTAMP 属性还将更新 timestamp 列,它是外键的一部分。
删除该属性将解决实际问题。但你也应该做更多的改变:
删除 DEFAULT CURRENT_TIMESTAMPMailHeader 表,因为您总是希望从父表插入正确的时间戳。
删除 ON UPDATE CURRENT_TIMESTAMPMail 表,以避免更新行时出现相同的问题。如果从不更新,那么也不需要该属性。
我建议用一个 AUTO_INCREMENT PRIMARY KEY .
也不清楚你为什么需要 MailHeader 一张table也没有。您也可以添加列 title , seen 以及 replyMail table(我想没有邮件头的邮件是不可能存在的。)

相关问题