mysql防止重复插入记录方式总结

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

相关文章