我有这两张桌子......
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
,CONSTRAINTMailHeader_ibfk_1
外键(timestamp
,sender
,receiver
) 参考timestamp
,sender
,receiver
)
我尝试了最简单的方法,在两个表中都有一条记录并使用了#34; MySQL-Workbench"用于更改非键列的工具。有完全相同的错误。 我真的不明白......
答案 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
表。您也可以将MailHeader
,title
和seen
列添加到reply
表中。 (我想没有标题就不能存在邮件。)