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
的表,其中包含两列id
和value
。有一个条目,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 - 忽略插入错误:重复条目的主要内容,如果未能解决你的问题,请参考以下文章