MySQL-忽略插入错误:重复输入


75

我正在使用PHP。

请问什么是将新记录插入数据库的正确方法,该数据库具有唯一字段。我要批量插入很多记录,而我只想插入新记录,而我不想重复条目有任何错误。

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

我想以某种方式告诉MySQL忽略这些插入而没有任何错误。

谢谢


插入忽略为我工作问题是从表中删除了一些行,并试图插入以前删除过的具有相同ID的行,在这种情况下,“插入忽略”语句起作用了
Balaji 2015年

Answers:


164

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

如果要用相同密钥的新记录覆盖旧记录,则可以使用REPLACE INTO语法。

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

编辑:以为我会添加一些示例。

例子

假设您有一个tbl由两列id和命名的表value。只有一个条目,id = 1,value = 1。如果运行以下语句:

REPLACE INTO tbl VALUES(1,50);

您仍然有一条记录,id = 1值= 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且值为200的记录。


9
“如果使用IGNORE关键字,则在执行INSERT语句时发生的错误将被视为警告。” -来自上面的插入链接
gradbot

2
警告不会引发错误,因此您的脚本将继续执行。从手册中:如果您使用IGNORE关键字,则在执行INSERT语句时发生的错误将被视为警告。例如,如果没有IGNORE,则复制表中现有UNIQUE索引或PRIMARY KEY值的行会导致重复键错误,并且该语句将中止。使用IGNORE,仍不会插入该行,但是不会发出错误。
zombat

IGNORE将忽略可能与重复键无关的错误。最好这样做,ON DUPLICATE KEY UPDATE field=field这样您就可以捕获那些错误,并且作为奖励,没有任何警告。
Chinoto Vokro'3

-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);

使用双表可以使您在select语句中输入值,即使当前未将值存储在表中也是如此。

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


这不是执行此操作的正确方法。该解决方案速度慢,难以维护并且容易出错。将INSERT与IGNORE一起使用将是一个更好的解决方案。
womp

这似乎是笛卡尔联接,在这种情况下不建议这样做。
蓝色之水


-3

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


-3
$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";
}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.