MySQL - 忽略插入错误:重复条目

Posted

技术标签:

【中文标题】MySQL - 忽略插入错误:重复条目【英文标题】:MySQL - ignore insert error: duplicate entry 【发布时间】:2010-10-23 04:23:57 【问题描述】:

我正在使用 php

请问将新记录插入具有唯一字段的数据库的正确方法是什么。 我正在批量插入大量记录,我只想插入新记录,并且我不希望重复条目出现任何错误。

是否有唯一的方法首先进行 SELECT 并查看该条目是否在 INSERT 之前已经存在 - 并且仅在 SELECT 没有返回记录时才进行 INSERT?我希望不会。

我想以某种方式告诉 mysql 忽略这些插入而不会出现任何错误。

谢谢

【问题讨论】:

insert ignore 对我有用 问题是从表中删除了一些行,并尝试插入之前删除的相同 ID 的行,在这种情况下“insert ignore”语句有效 【参考方案1】:

您可以使用 EXISTS 条件确保不插入重复信息。

例如,如果您有一个名为 clients 的表,其主键为 client_id,您可以使用以下语句:

INSERT INTO clients
(client_id, client_name, client_type)
SELECT supplier_id, supplier_name, 'advertising'
FROM suppliers
WHERE not exists (select * from clients
where clients.client_id = suppliers.supplier_id);

此语句使用子选择插入多条记录。

如果要插入单条记录,可以使用以下语句:

INSERT INTO clients
(client_id, client_name, client_type)
SELECT 10345, 'IBM', 'advertising'
FROM dual
WHERE not exists (select * from clients
where clients.client_id = 10345);

使用双表允许您在选择语句中输入值,即使这些值当前未存储在表中。

来自http://www.techonthenet.com/sql/insert.php

【讨论】:

这不是正确的做法。这种解决方案速度慢、难以维护并且容易出错。将 INSERT 与 IGNORE 结合使用会是一个更好的解决方案。 这似乎是笛卡尔连接,在这种情况下不建议这样做。【参考方案2】:
$duplicate_query=mysql_query("SELECT * FROM student") or die(mysql_error());
$duplicate=mysql_num_rows($duplicate_query);
if($duplicate==0)

    while($value=mysql_fetch_array($duplicate_query)
    
        if(($value['name']==$name)&& ($value['email']==$email)&& ($value['mobile']==$mobile)&& ($value['resume']==$resume))
        
            echo $query="INSERT INTO student(name,email,mobile,resume)VALUES('$name','$email','$mobile','$resume')";
            $res=mysql_query($query);
            if($query)
            
                echo "Success";
            
            else
            
                echo "Error";
            
            else
            
                echo "Duplicate Entry";
            
        
    

else

    echo "Records Already Exixts";

【讨论】:

【参考方案3】:

如果您不想在有重复记录时采取任何措施,您可以使用INSERT... IGNORE 语法。

如果您想用具有相同键的新记录覆盖旧记录,可以使用REPLACE INTO 语法。

或者,如果您想在遇到重复记录时对记录执行更新,则可以使用INSERT... ON DUPLICATE KEY UPDATE 语法。

编辑:我想我会添加一些例子。

示例

假设您有一个名为tbl 的表,其中包含两列idvalue。有一个条目,id=1 和 value=1。如果您运行以下语句:

REPLACE INTO tbl VALUES(1,50);

您还有一条记录,id=1 value=50。请注意,整个记录首先被删除,然后重新插入。那么:

INSERT IGNORE INTO tbl VALUES (1,10);

操作成功执行,但没有插入任何内容。你仍然有 id=1 和 value=50。最后:

INSERT INTO tbl VALUES (1,200) ON DUPLICATE KEY UPDATE value=200;

您现在有一条 id=1 和 value=200 的记录。

【讨论】:

"如果您使用 IGNORE 关键字,则执行 INSERT 语句时发生的错误将被视为警告。" - 从上面的插入链接 警告不会引发错误,因此您的脚本将继续执行。来自手册:如果您使用 IGNORE 关键字,则在执行 INSERT 语句时发生的错误将被视为警告。例如,如果没有 IGNORE,复制表中现有 UNIQUE 索引或 PRIMARY KEY 值的行会导致重复键错误并且语句被中止。使用 IGNORE,行仍然没有插入,但不会发出错误。 IGNORE 将忽略可能与重复键无关的错误。最好使用ON DUPLICATE KEY UPDATE field=field,这样您就可以捕捉到这些错误,并且作为奖励,不会有任何警告。【参考方案4】:

尝试创建一个没有唯一约束的重复表,最好是临时表,然后将批量加载到该表中。然后从临时表中只选择唯一的(DISTINCT)项并插入到目标表中。

【讨论】:

【参考方案5】:

您可以使用triggers。

同时检查this introduction guide to triggers。

【讨论】:

以上是关于MySQL - 忽略插入错误:重复条目的主要内容,如果未能解决你的问题,请参考以下文章

从 perl 插入 mysql 时的 dup 条目

错误代码:1062。重复条目 'PRIMARY'

在mysql中的重复条目上跳过插入

MySQL utf8 多字节(utf8mb4)插入重复条目问题

MySQL上主键的重复条目

MySQL数据库的重复条目条件