我试图将数据从tbllicenseissued复制到licenses MySQL表:
INSERT INTO `licenses` (UserID, TypeID, IssueDate, ExpirationDate)
SELECT UserID, TypeID, IssueDate, ExpirationDate FROM `tbllicenseissued`licenses有一个阻止传输的外键约束:licenses.UserID是user表中的主键
错误代码: 1452 无法添加或更新子行:外键约束失败(
test.licenses、约束UserID外键(UserID)引用main.user(id)在更新级联上的删除级联)
如果删除了这个键约束,操作就会成功,因此我猜测我要复制的数据包含在user表中找不到的If。
我想复制满足约束的记录,同时忽略可能导致错误的记录。我试着用INSERT IGNORE代替INSERT IGNORE,但没有结果。
增编
到目前为止,我已经尝试了答案中提出的所有查询,并在上面重新尝试了我自己的INSERT IGNORE。它们都给出了相同的错误消息(上面更新了包含完整错误的错误)。
我还确认,如果删除外键约束并尝试查询(对原始表的副本),则查询将成功运行。
以证实我的怀疑,即问题在于UserID在tbllicenseissued中丢失了user。
SELECT UserID FROM `tbllicenseissued` a
WHERE a.UserID NOT IN (SELECT id FROM `user`);发现了26条记录。表格结构如下:
DESCRIBE licenses

DESCRIBE tbllicenseissued

DESCRIBE user

我刚刚检查并确认这三个表都是InnoDB
发布于 2016-09-11 02:41:32
我假设您不希望插入不匹配的行。如果是这样,您有两个解决方案。其中一个在查询中进行检查:
INSERT INTO `licenses` (UserID, TypeID, IssueDate, ExpirationDate)
SELECT UserID, TypeID, IssueDate, ExpirationDate
FROM tbllicenseissued
WHERE UserId NOT IN (SELECT UserID FROM Users WHERE UserId IS NOT NULL);我希望INSERT IGNORE也能解决这个问题:
INSERT IGNORE INTO `licenses` (UserID, TypeID, IssueDate, ExpirationDate)
SELECT UserID, TypeID, IssueDate, ExpirationDate
FROM tbllicenseissued;然而,你的问题说这对你不起作用。
发布于 2016-09-11 02:39:29
可以这样使用,要跳过用户id约束中断的数据,请使用id to user表:
INSERT INTO `licenses` (UserID, TypeID, IssueDate, ExpirationDate)
SELECT UserID, TypeID, IssueDate, ExpirationDate FROM `tbllicenseissued` a
INNER JOIN User u ON a.UserID = u.UserIDhttps://stackoverflow.com/questions/39432328
复制相似问题