MySQLmysql防止再插入记录方式总结

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的周转和INSERT很相如,但是倘若原本记录与新记录出雷同的价值,则当新记录为插入之前,旧记录为剔除,即:

尝试把新行插入到表中

当为对于主键或唯一要字出现重第一字错误而招致插入失败时:
从表中删除含有更第一字值的扑行 再次尝试将新行插入到说明中
旧记录与新记录有相同之价的判定标准便是: 表有一个PRIMARY
KEY或UNIQUE索引,否则,使用一个REPLACE语句没有意义。该语句会与INSERT相同,因为从没索引被用来确定是不是新行复制了另外的推行。
返回值:
REPLACE语句会返回一个勤,来指示让影响的履行的数额。该数是深受删和于插入的行数的和
受影响的行数可以好地确定是否REPLACE只上加了平履,或者是不是REPLACE也交替了别行:检查该数是否为1(添加)或还要命(替换)。
示例: # 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

要是‍上所形容,你吧足以在INSERT INTO…..后面长 ON DUPLICATE KEY
UPDATE方法来促成。如果你指定了ON DUPLICATE KEY
UPDATE,并且插入行后见面招致在一个UNIQUE索引或PRIMARY
KEY中出现重复值,则执行旧行UPDATE。
例如,如果列a被定义也UNIQUE,并且包含值1,则以下简单独报告句具有相同之效果:

代码如下:

 代码如下

复制代码

  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;

倘实行作为新记录为插入,则被影响执行的值也1;如果原本的笔录被更新,则让影响执行的价为2。

诠释:如果列b也是唯一排,则INSERT与这个UPDATE语句相当: 代码如下:

 代码如下

复制代码

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。

代码如下:

 代码如下

复制代码

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 “该用户名已存在,请复选择用户称!”; } ?>

偎依一些删减重复记录的措施

询问以及删除重复记录的SQL语句
1、查找表中剩下的重复记录,重复记录是冲单个字段(peopleId)来判定

 代码如下

复制代码

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

2、删除表中多余的重复记录,重复记录是基于单个字段(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)

4、删除表中多余的重复记录(多个字段),只留下起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
网站地图xml地图