SQL 更新非键列时出现错误 1452
SQL Error 1452 while UPDATE non key columns
我有那两个表...
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:
Cannot add or update a child row: a foreign key constraint fails
(usr_web4930_1
.MailHeader
, CONSTRAINT MailHeader_ibfk_1
FOREIGN KEY (timestamp
, sender
, receiver
)
REFERENCES Mail
(timestamp
, sender
, receiver
)
我尝试了最简单的方法,在两个表中都有一条记录,并使用 "MySQL-Workbench" 工具更改非键列。有完全相同的错误。
真的没看懂...
如您所见,您不仅在更新非关键列。 ON UPDATE CURRENT_TIMESTAMP
属性还将更新 timestamp
列,它是外键的一部分。
删除该属性将解决实际问题。但是你也应该做更多的改变:
从 MailHeader
table 中删除 DEFAULT CURRENT_TIMESTAMP
,因为您总是希望从 parent table.[=22 中插入正确的时间戳=]
从 Mail
table 中删除 ON UPDATE CURRENT_TIMESTAMP
,以避免在您想要更新行时出现同样的问题。如果您从不更新,那么您也不需要该属性。
此外,我建议使用 AUTO_INCREMENT PRIMARY KEY
。
也不清楚您为什么需要 MailHeader
table。您也可以将 title
、seen
和 reply
列添加到 Mail
table。 (我想没有 header 邮件就不可能存在。)
我有那两个表...
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:
Cannot add or update a child row: a foreign key constraint fails (
usr_web4930_1
.MailHeader
, CONSTRAINTMailHeader_ibfk_1
FOREIGN KEY (timestamp
,sender
,receiver
) REFERENCEStimestamp
,sender
,receiver
)
我尝试了最简单的方法,在两个表中都有一条记录,并使用 "MySQL-Workbench" 工具更改非键列。有完全相同的错误。 真的没看懂...
如您所见,您不仅在更新非关键列。 ON UPDATE CURRENT_TIMESTAMP
属性还将更新 timestamp
列,它是外键的一部分。
删除该属性将解决实际问题。但是你也应该做更多的改变:
从 MailHeader
table 中删除 DEFAULT CURRENT_TIMESTAMP
,因为您总是希望从 parent table.[=22 中插入正确的时间戳=]
从 Mail
table 中删除 ON UPDATE CURRENT_TIMESTAMP
,以避免在您想要更新行时出现同样的问题。如果您从不更新,那么您也不需要该属性。
此外,我建议使用 AUTO_INCREMENT PRIMARY KEY
。
也不清楚您为什么需要 MailHeader
table。您也可以将 title
、seen
和 reply
列添加到 Mail
table。 (我想没有 header 邮件就不可能存在。)