SQL Servermysql幸免重复插入记录格局总计

mysql幸免再一次插入记录方式总计

 

以免mysql重复插入记录的章程有诸七种,常用的是ignore,Replace,ON DUPLICATE
KEY UPDATE,当然大家也得以在php中加以判断了。

 

方案一:使用ignore关键字

若是是用主键primary或然唯一索引unique区分了笔录的唯一性,幸免重复插入记录能够选取:

代码如下:

 代码如下

复制代码

 INSERT IGNORE INTO `table_name` (`email`, `phone`, `user_id`)
VALUES (‘test9@163.com’, ‘99999’, ‘9999’);

  那样当有重复记录就会忽略,执行后赶回数字0

还有个使用正是复制表,幸免重复记录: 代码如下:

 代码如下

复制代码

 INSERT IGNORE INTO `table_1` (`name`) SELECT `name` FROM
`table_2`;

  方案二:使用Replace

语法格式:

代码如下:

 代码如下

复制代码

REPLACE INTO `table_name`(`col_name`, …) VALUES (…); REPLACE
INTO `table_name` (`col_name`, …) SELECT …; REPLACE INTO
`table_name` SET `col_name`=’value’,

…算法表达:

REPLACE的运维与INSE讴歌ZDXT很相像,可是假如旧记录与新记录有同等的值,则在新记录被插入从前,旧记录被删去,即:

尝试把新行插入到表中

当因为对此主键或唯一主要字出现重复第一字错误而造成插入退步时:
从表中删除含有重复第3字值的抵触行 再度尝试把新行插入到表中
旧记录与新记录有一致的值的论断标准正是: 表有三个PMuranoIMA奥德赛Y
KEY或UNIQUE索引,不然,使用3个REPLACE语句未有意思。该语句会与INSE卡宴T相同,因为从没索引被用于鲜明是还是不是新行复制了别样的行。
再次来到值:
REPLACE语句会再次来到一个数,来提醒受影响的行的数量。该数是被删去和被插入的行数的和
受影响的行数能够不难地规定是或不是REPLACE只添加了壹行,恐怕是还是不是REPLACE也交替了其余行:检查该数是还是不是为一(添加)或越来越大(替换)。
示例: # eg:(phone字段为唯一索引)

代码如下:

 代码如下

复制代码

REPLACE INTO `table_name` (`email`, `phone`, `user_id`) VALUES
(‘test569’, ‘99999’, ‘123’);

除此以外,在 SQL Server 中得以那样处理:

代码如下:

 代码如下

复制代码

if not exists (select phone
from t where phone= ‘1’)   insert into t(phone, update_time)
values(‘1’, getdate()) else    update t set update_time = getdate()
where phone= ‘1’

方案三:ON DUPLICATE KEY UPDATE

如‍上所写,你也能够在INSEEvoqueT INTO…..前边加上 ON DUPLICATE KEY
UPDATE方法来落到实处。倘使您内定了ON DUPLICATE KEY
UPDATE,并且插入行后会促成在3个UNIQUE索引或POdysseyIMA汉兰达Y
KEY中冒出重复值,则实施旧行UPDATE。
例如,假设列a被定义为UNIQUE,并且包含值一,则以下多少个语句具有同等的功能:

代码如下:

 代码如下

复制代码

  INSERT INTO `table` (`a`, `b`, `c`) VALUES (1, 2, 3) ON
DUPLICATE KEY UPDATE `c`=`c`+1; UPDATE `table` SET `c`=`c`+1
WHERE `a`=1;

只要行作为新记录被插入,则受影响行的值为一;假如原本的笔录被更新,则受影响行的值为二。

声明:如若列b也是绝无仅有列,则INSEBMWX叁T与此UPDATE语句万分: 代码如下:

 代码如下

复制代码

UPDATE `table` SET `c`=`c`+1 WHERE `a`=1 OR `b`=2 LIMIT 1;

万1a=壹 O凯雷德b=2与多个行向匹配,则只有2个行被更新。平日,您应该尽量制止对含有多少个唯一主要字的表使用ON
DUPLICATE KEY子句。

你能够在UPDATE子句中运用VALUES(col_name)函数从INSE卡宴T…UPDATE语句的INSE卡宴T部分引用列值。换句话说,如若未有发生再一次第叁字争辩,则UPDATE子句中的VALUES(col_name)可以引用被插入的col_name的值。本函数越发适用于多行插入。VALUES()函数只在INSE福特ExplorerT…UPDATE语句中有含义,此外时候会回来NULL。

代码如下:

 代码如下

复制代码

INSERT INTO `table` (`a`, `b`, `c`) VALUES (1, 2, 3), (4, 5, 6)
ON DUPLICATE KEY UPDATE `c`=VALUES(`a`)+VALUES(`b`);

本语句与以下三个语句功能一样:

代码如下:

 代码如下

复制代码

INSERT INTO `table` (`a`, `b`, `c`) VALUES (1, 2, 3) ON
DUPLICATE KEY UPDATE `c`=3; INSERT INTO `table` (`a`, `b`,
`c`) VALUES (4, 5, 6) ON DUPLICATE KEY UPDATE c=9;

表明:当您使用ON DUPLICATE KEY UPDATE时,DELAYED选项被忽视。

示例:

本条例子是本身在骨子里项目中用到的:是将三个表的数量导入到别的一个表中,数据的重复性就得考虑(如下),唯一索引为:email:

代码如下:

 代码如下

复制代码

INSERT INTO `table_name1` (`title`, `first_name`,
`last_name`, `email`, `phone`, `user_id`, `role_id`,
`status`, `campaign_id`)     SELECT ”, ”, ”,
`table_name2`.`email`, `table_name2`.`phone`, NULL, NULL,
‘pending’, 29 FROM `table_name2`     WHERE
`table_name2`.`status` = 1 ON DUPLICATE KEY UPDATE
`table_name1`.`status`=’pending’

再贴八个例子:

代码如下:

 代码如下

复制代码

 INSERT INTO `class` SELECT * FROM `class1` ON DUPLICATE KEY UPDATE
`class`.`course`=`class1`.`course`

别的首要:DELAYED  做为火速插入,并不是很关注失效性,进步插入质量。
IGNORE  只关注主键对应记录是不存在,无则增加,有则忽略。

php防止再度插入记录实例

 代码如下

复制代码

<?php $link=mysql_connect(‘localhost’,’root’,’1234’);
//得到MySQL数据库连接
$username=$_GET[“name”]; //获得从客户端表单传过来的多寡 $q=”select *
from usertable where user_name=’$username'”; mysql_query(“SET NAMES
gb2312”); //防止出现汉语乱码 $rs = mysql_query($q, $link);
//查询数据库 $num_rows =
mysql_num_rows($rs); //获得查询结果的总公司数 if($num_rows==0) // 烈火?
liehuo.net 欢迎复制,拒绝恶意收集 liehuo.net { $exec=”insert
into student (user_name) values ($username)”; mysql_query(“SET NAMES
gb2312”); mysql_query($exec, $link);
//若未有此用户则将数据插入到数据库(注册用户) echo “用户注册成功!”; }
else { echo “该用户名已存在,请重新选取用户名!”; } ?>

附1些删减重复记录的措施

查询及删除重复记录的SQL语句
一、查找表中多余的重复记录,重复记录是遵照单个字段(peopleId)来判断

 代码如下

复制代码

select * from people where peopleId in (select peopleId from people
group by peopleId having
count(peopleId) > 1)

二、删除表中多余的重复记录,重复记录是基于单个字段(peopleId)来判断,只留有rowid最小的笔录

 代码如下

复制代码

delete from people where peopleId in (select peopleId from people group
by peopleId having count(peopleId) > 1) and rowid not in (select
min(rowid) from people group by peopleId having count(peopleId )>1)

3、查找表中剩下的重复记录(八个字段)

 代码如下

复制代码

select * from vitae a where (a.peopleId,a.seq) in (select peopleId,seq
from vitae group by peopleId,seq having count(*) > 1)

肆、删除表中多余的重复记录(两个字段),只留有rowid最小的笔录

 代码如下

复制代码

delete from vitae a where (a.peopleId,a.seq) in (select peopleId,seq
from vitae group by peopleId,seq having count(*) > 1) and rowid not
in (select min(rowid) from vitae group by peopleId,seq having
count(*)>1)

5、查找表中剩下的重复记录(多个字段),不包括rowid最小的笔录

 代码如下

复制代码

select * from vitae a where (a.peopleId,a.seq) in (select peopleId,seq
from vitae group by peopleId,seq having count(*) > 1) and rowid not
in (select min(rowid) from vitae group by peopleId,seq having
count(*)>1)

 ==============================

 

SOLVED! Created 3 separated queries for each row, working for now!

So with added UNIQUE INDEX to the (auctionid, order) pair have this
workable code:

INSERT IGNORE INTO
selections
(
selections.auctionid,
selections.order,
selections.title,
startamount
)
SELECT
auctions.id,
1,
PlayerA,
0.01
FROM
auctions, game
WHERE
auctions.BetfairMark = game.BetfairMarketID
;

INSERT IGNORE INTO
elections
(
selections.auctionid,
selections.order,
selections.title,
startamount
)
SELECT
auctions.id,
2,
PlayerB,
0.01
FROM
auctions, game
WHERE
auctions.BetfairMark = game.BetfairMarketID

相关文章