MySQL插入...选择:使用外键约束错误跳过记录

时间:2016-09-11 02:33:23

标签: mysql constraints

我尝试将数据从#include<stdio.h> #include<string.h> #include<stdlib.h> void removeDuplicates(char *); void removeDuplicates(char *inp) { int i=0, j=0, FLAG=0, repeat=0; while(inp[i]!='\0') { if(FLAG==1) { inp[i-repeat]=inp[i]; } if(j==(j | 1<<(inp[i]-'\0'))) { repeat++; FLAG=1; } j= j | 1<<(inp[i]-'\0'); i++; } inp[i-repeat]='\0'; } int main() { char inp[100] = "aaAABCCDdefgccc"; //char inp[100] = "ccccc"; //char inp[100] = "\0"; //char *inp = (char *)malloc(sizeof(char)*100); printf (" INPUT STRING : %s\n", inp); removeDuplicates(inp); printf (" OUTPUT STRING : %s:\n", inp); return 1; } 复制到tbllicenseissued MySQL表:

licenses

INSERT INTO `licenses` (UserID, TypeID, IssueDate, ExpirationDate) SELECT UserID, TypeID, IssueDate, ExpirationDate FROM `tbllicenseissued` 有一个阻止传输的外键约束:licenseslicenses.UserID表中的主键

  

错误代码:1452

     

无法添加或更新子行:外键约束失败(usertest,CONSTRAINT licenses FOREIGN KEY(UserID)参考UserIDmainuser)ON UPETE CASCADE ON UPDATE CASCADE)

如果删除此键约束,操作会成功,因此我猜测我复制的数据包含id表中找不到的ID。

我想复制符合约束条件的记录,同时忽略会引发错误的记录。我尝试用user取代INSERT无效。

附录

到目前为止,我已经尝试了答案中建议的所有问题,并且我在上面重试了我自己的INSERT IGNORE。它们都给我相同的错误消息(上面更新以包含完整错误)。

我还确认,如果删除外键约束并尝试查询(在原始表的副本上),查询将成功运行。

要确认我怀疑INSERT IGNORE UserIDtbllicenseissued遗漏了问题{/ 1}}:

user

共找到26条记录。表结构是:

SELECT  UserID FROM `tbllicenseissued` a
WHERE a.UserID  NOT IN (SELECT id FROM `user`);

enter image description here

DESCRIBE licenses

enter image description here

DESCRIBE tbllicenseissued

enter image description here

我刚检查并确认所有三个表都是DESCRIBE user

2 个答案:

答案 0 :(得分:0)

您可以像这样使用,跳过具有损坏的用户ID约束的数据使用内部联接到用户表:

INSERT INTO `licenses` (UserID, TypeID, IssueDate, ExpirationDate)
SELECT  UserID, TypeID, IssueDate, ExpirationDate FROM `tbllicenseissued` a
INNER JOIN User u ON a.UserID = u.UserID

答案 1 :(得分:0)

我假设你不想插入不匹配的行。如果是这样,你有两个解决方案。一个人在查询中进行检查:

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;

但是,您的问题表明这不适合您。