UPDATE非键列时出现SQL错误1452

时间:2018-06-10 19:38:16

标签: mysql sql mysql-error-1452

我有这两张桌子......

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_1MailHeader,CONSTRAINT MailHeader_ibfk_1   外键(timestampsenderreceiver)   参考Mailtimestampsenderreceiver

我尝试了最简单的方法,在两个表中都有一条记录并使用了#34; MySQL-Workbench"用于更改非键列的工具。有完全相同的错误。 我真的不明白......

1 个答案:

答案 0 :(得分:0)

如您所知,您不仅要更新非关键列if df1.shape[0] > df2.shape[0]: new_rows = df1.shape[0] - df2.shape[0] df3 = pd.DataFrame(np.zeros((new_rows, df2.shape[1]))) df2 = df2.append(df3) new_df = pd.concat((df1, df2), axis=1) #Alternative elif goes here doing the converse. 属性还将更新ON UPDATE CURRENT_TIMESTAMP列,该列是外键的一部分。

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

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

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

我还建议使用Mail

还不清楚为什么你需要AUTO_INCREMENT PRIMARY KEY表。您也可以将MailHeadertitleseen列添加到reply表中。 (我想没有标题就不能存在邮件。)