在寫程式的時候經常碰到在向資料庫中插入資料時,判斷資料是否已存在。諸如有存在的資料時跳過,不存在的資料繼續插入,要避免重複插入,又不想折騰兩回資料庫連線操作,這裡可能會用到以下語句,現小結一下。
ignore
是mysql相對於標準sql的擴充套件。如果在新錶中有重複關鍵字,此種方法效率比較高,判斷是否存在,存在會丟棄掉這行資料,不做任何插入,否則插入。當插入資料時,如出現錯誤時,如重複資料,將不返回錯誤,只以警告形式返回。所以使用ignore請確保語句本身沒有問題,否則也會被忽略掉。這樣不用校驗是否存在了,有則忽略,無則新增。例如:
insert ignore into books當primary或者unique重複時,則執行(name
)values
('mysql manual'
)
update
語句,如update
後為無用語句,如id=id
,則同1功能相同,但錯誤不會被忽略掉。例如,為了實現重複的資料插入不報錯,可使用一下語句:
insert into table (a如果行作為新記錄被插入,則受影響行的值為1;如果原有的記錄被更新,則受影響行的值為2。如果列b也是唯一列,則,b,c
)values (1
,2,3
)on duplicate key updat cut
=cut +1
insert
與此update
語句相當。
您可以在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
)
select
的條件判斷是否插入,可以不光通過primary 和unique來判斷,也可通過其它條件。例如:
insert into books需求表中有primarykey,或者unique索引,如果資料庫已經存在資料,則用新資料替換,如果沒有資料效果則和(name
)select
'mysql manual'
from dual where not exists
(select id from books where id =1
)
insert into
一樣。(此種方法是利用替換的方法,有點似類於先刪除再插入。如果存在primary or unique相同的記錄,則先刪除掉。再插入新記錄。
replace into books select 1,'mysql manual'
from books
replace
語句會返回乙個數,來指示受影響的行的數目。該數是被刪除和被插入的行數的和。如果對於乙個單行replace
該數為1,則一行被插入,同時沒有行被刪除。如果該數大於1,則在新行被插入前,有乙個或多個舊行被刪除。如果表包含多個唯一索引,並且新行複製了在不同的唯一索引中的不同舊行的值,則有可能是乙個單一行替換了多個舊行。
注:replace
發現重複的先刪除再插入,如果記錄有多個字段,在插入的時候如果有的字段沒有賦值,那麼新插入的記錄這些欄位為空。
大家要根據自己的需求來確定,不一定就適合你現在的需求;我只是提示大家還有這麼些個實用的小知識大家可以靈活運用到專案裡邊。
大量插入資料時關閉主鍵唯一性檢測
我們想實現的效果是 合併資料庫的說話,如果出現主鍵重複的情況,首先不報錯。如果可以,則兩條資料都保留,更新其中的一條資料,然後使資料不唯一。思路一 mysql插入資料時可以關閉主鍵唯一檢測,關閉檢測,等資料庫合併完成,用指令碼或者手動修改主鍵重複的值 資料量比較小時 此方法測試了不成功,參照下文做的...
MySQL唯一性插入資料的幾種實現實現
在 mysql 中,插入 insert 一條記錄,經常需要檢查這條記錄是否已經存在,只有當記錄不存在時才執行插入操作。mysql在存在主鍵衝突或者唯一鍵衝突的情況下,根據插入策略不同,一般有以下四種避免方法。1 insert ignore 2 replace into 3 insert on dup...
mysql 唯一約束 Mysql 唯一性約束新增
一 單列唯一約束 1.建表時加上唯一性約束 create table t user id int 11 not null auto increment,username varchar 18 not null unique,password varchar 18 not null,primary k...