【问题标题】:SQL Error 1452 while UPDATE non key columnsSQL 错误 1452 而 UPDATE 非关键列
【发布时间】:2018-11-20 02:14:47
【问题描述】:

我有那两张桌子...

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”工具更改非键列。有完全相同的错误。 我真的不明白...

【问题讨论】:

  • 请发布样本数据和更新查询以重现该问题。
  • 也请用实际代码替换...。如果timestamp 列有ON UPDATE CURRENT_TIMESTAMP - 这就是问题所在。
  • 你们真的很快,伙计们。 :) 阅读“ON UPDATE CURRENT_TIMESTAMP”后,一切都变得清晰了。谢谢! ;)

标签: mysql sql mysql-error-1452


【解决方案1】:

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

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

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

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

我建议使用AUTO_INCREMENT PRIMARY KEY

也不清楚为什么需要MailHeader 表。您也可以将列titleseenreply 添加到Mail 表中。 (我猜如果没有标头,邮件就不可能存在。)

【讨论】:

  • 再次您好,很抱歉回答迟了。我改变了你提到的那些定义。感谢远。 MailHeader 表示两个人之间的积极对话。如果你有一个 MailHeader 条目,那么它必须至少有一个 Mail 指向(父表的外键)。我用它作为索引表的比喻来快速获取活跃的对话。对话由邮件记录表示。所以可能有一个或多个邮件。标头用作指向最后一条邮件记录的指针。
  • 在运行时,用户通过查询适当的 MailHeader 来获得概览。现在用户正在选择一个条目,匹配的邮件记录将显示为“类似聊天”的外观。顺便说一句:由于缺少声誉,无法为您的帖子投票。
猜你喜欢
  • 2013-11-15
  • 2014-09-10
  • 1970-01-01
  • 2013-12-03
  • 2018-02-15
  • 2017-06-14
  • 1970-01-01
  • 2014-04-08
  • 2023-04-01
相关资源
最近更新 更多