mysql在存在主鍵衝突或者唯一鍵衝突的情況下,根據插入策略不同,一般有以下三種避免方法。
insert ignore
replace into
insert on duplicate key update
create table `t3` (
`id` int(11) not null auto_increment,
`c1` int(11) default null,
`c2` varchar(20) default null,
`c3` int(11) default null,
primary key (`id`),
unique key `uidx_c1` (`c1`)
) engine=innodb auto_increment=4 default charset=utf8
select * from t3;
id
c1c2c31
1a12
2a18
null
null114
4bbnull175
cc4insert ignore會忽略資料庫中已經存在的資料(根據主鍵或者唯一索引判斷),如果資料庫沒有資料,就插入新的資料,如果有資料的話就跳過這條資料.
insert ignore into t3 (c1,c2,c3) values(5,'cc',4),(6,'dd',5);
雖然只增加了一條記錄,但是auto_increment還是增加了2個
replace into 首先嘗試插入資料到表中。 如果發現表中已經有此行資料(根據主鍵或者唯一索引判斷)則先刪除此行資料,然後插入新的資料,否則,直接插入新資料。
使用replace into,你必須具有delete和insert許可權
replace into t3 (c1,c2,c3) values(3,'new',8);
如果在insert into 語句末尾指定了on duplicate key update,並且插入行後會導致在乙個unique索引或primary key**現重複值,則在出現重複值的行執行update;如果不會導致重複的問題,則插入新行,跟普通的insert into一樣。
使用insert into,你必須具有insert和update許可權
如果有新記錄被插入,則受影響行的值顯示1;如果原有的記錄被更新,則受影響行的值顯示2;如果記錄被更新前後值是一樣的,則受影響行數的值顯示0
insert into t3(c1,c2,c3) values (3,'new',5) on duplicate key update c1=c1+3;
注意:如果要獲取自增的id值,sql語句應該為:
ibatis:
select last_insert_id()
insert into table (`c1`, `c2`)
values
(#c1#, #c2#, )
on duplicate key update
id=last_insert_id(id),
mybatis:
select last_insert_id()
insert into table (`c1`, `c2`)
values
(#c1#, #c2#, )
on duplicate key update
id=last_insert_id(id),
這三種方法都能避免主鍵或者唯一索引重複導致的插入失敗問題。insert ignore能忽略重複資料,只插入不重複的資料。
replace into和insert … on duplicate key update,都是替換原有的重複資料,區別在於replace into是刪除原有的行後,在插入新行,如有自增id,這個會造成自增id的改變;insert … on duplicate key update在遇到重複行時,會直接更新原有的行,具體更新哪些字段怎麼更新,取決於update後的語句。
MySQL不插入重覆記錄
想插入一條記錄,如果有則不插入,無則插入。表示由乙個自增長id主鍵和其他幾個記錄 t version id,package name,first,second,third,forth 原先想用insert ignore into,但是發現沒有用,因為它把id也看做不同。於是我找了網上的另外一種方法 ...
Mysql避免重複插入記錄
可使用ignore關鍵字 如果有用主鍵primary key或者唯一索引unique區分了記錄的唯一性,當我們無意插入相同資料的時候 主鍵值或是唯一索引值重複 insert into table name email,phone,user id values test 163.com 99999 9...
mysql避免重複插入記錄
1.ignore,如果遇到新插入的資料中與原有資料有唯一鍵衝突,會忽略操作,返回0 insert ignore into table name email phone user id values test9 163.com 99999 9999 2.replace,如果有衝突,會進行兩個操作 刪除...