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

时间:2009-05-01 17:48:06

标签: php mysql insert

我在PHP工作。

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

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

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

谢谢

6 个答案:

答案 0 :(得分:152)

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

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

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

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

实施例

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

REPLACE INTO tbl VALUES(1,50);

您仍有一条记录,其中id = 1值= 50。请注意,整个记录首先是DELETED,然后重新插入。然后:

INSERT IGNORE INTO tbl VALUES (1,10);

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

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

您现在拥有一条id为1且值为200的记录。

答案 1 :(得分:-1)

您可以使用triggers

同时检查this introduction guide to triggers

答案 2 :(得分:-1)

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

答案 3 :(得分:-1)

数据库架构是什么样的?

您可以为每个插入添加一个auto increment的ID列,以保证唯一的行。

答案 4 :(得分:-1)

问题:我正在与客户建立数据库。我知道你使用“insert”语句在数据库中插入信息,但是如何确保我不再输入相同的客户信息呢?

答案:您可以确保不使用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

答案 5 :(得分:-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";
}