防止重复插入记录sql实现方法
replace语法
replace的语法格式为:
1. replace into table_name(col_name, ...) values(...)
2. replace into table_name(col_name, ...) select ...
3. replace into table_name set col_name=value, ...
算法说明:
replace的运行与insert很相像,但是如果旧记录与新记录有相同的值,则在新记录易做图入之前,旧记录被删除,即:
1. 尝试把新行插入到表中
2. 当因为对于主键或唯一关键字出现重复关键字错误而造成插入失败时:
从表中删除含有重复关键字值的冲突行
再次尝试把新行插入到表中
旧记录与新记录有相同的值的判断标准就是:表有一个primary key或unique索引,否则,使用一个replace语句没有意义。
该语句会与insert相同,因为没有索引被用于确定是否新行复制了其它的行。
返回值:
not exists
示例一:插入多条记录
假设有一个主键为 client_id 的 clients 表,可以使用下面的语句:
复制代码 代码如下:
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);
on duplicate key update
如上所写,你也可以在insert into.....后面加上 on duplicate key update方法来实现。
如果您指定了on duplicate key update,并且插入行后会导致在一个unique索引或primary key中出现重复值,
则执行旧行update。例如,如果列a被定义为unique,并且包含值1,则以下两个语句具有相同的效果:
mysql教程>insert into table (a,b,c) values (1,2,3)
->on duplicate key update c=c+1;
mysql>update table set c=c+1 where a=1;
如果行作为新记录易做图入,则受影响行的值为1;如果原有的记录被更新,则受影响行的值为2。
注释:如果列b也是唯一列,则insert与此update语句相当:
mysql> update table set c=c+1 where a=1 or b=2 limit 1;
如果a=1 or b=2与多个行向匹配,则只有一个行被更新。通常,您应该尽量避免对带有多个唯一关键字的表使用on duplicate key子句。
您可以在update子句中使用values(col_name)函数从insert...update语句的insert部分引用列值。
换句话说,如果没有发生重复关键字冲突,则update子句中的values(col_name)可以引用易做图入的col_name的值。本函数特别适用于多行插入。values()函数只在insert...update语句中有意义,其它时候会返回null。
mysql> insert into table (a,b,c) values (1,2,3),(4,5,6)-> on duplicate key update c=values(a)+values(b);
本语句与以下两个语句作用相同:
mysql> insert into table (a,b,c) values (1,2,3)
-> on duplicate key update c=3;
mysql> insert into table (a,b,c) values (4,5,6)
-> on duplicate key update c=9;
当您使用on duplicate key update时,delayed选项被忽略。
补充:数据库,mysql教程