我們遇到挺多這樣的問題,當使用者併發提交資料,重複提交資料。導致資料重複,或者 mysql
sql 報錯。
幾種解決辦法,對應到幾種業務場景。
這個應該是最常見的處理方式,是醉不安全的,因為一旦有併發其實完全防止不了,來看看偽**。
entity
entity
=service
.findbyid(10
);
if
(null
==entity
)else
先根據條件查詢,存在就更新,不存在新增,但是往往我們是集群、多列的狀態下,會再你正在判斷null == entity
的時候,另外乙個執行緒已經插入完畢了,導致你以為是不存在,重複插入。
我們平常的insert into
sql 是這麼寫:
insert into demo_in(a
,b,c
)values
(123,2
,4);
比如c
是主鍵,插入2次就會丟擲異常:
[
23000
][1062
]duplicate
entry
'4'for
key
'primary'
所以我們用到replace
關鍵字,他的作用如題,存在即更新,不存在即插入,和delete
+insert into
一樣。但是它乙個原子操作,是一步完成,所以我們不用擔心有其他問題的出現,但是使用replace
的時候,一定要保證表有唯一主鍵。
重要:執行replace
語句後,系統返回了所影響的行數,如果返回1,說明在表中並沒有重複的記錄,如果返回2,說明有一條重覆記錄,系統自動先呼叫了delete
刪除這條記錄,然後再記錄用insert
來插入這條記錄。
改造一下上面的語句就是:
replace into demo_in(a
,b,c
)values
(123,2
,4);
這個其實很簡單,因為 mysql 不能做到插入的時候帶where
條件,故用了一張臨時表來處理。
insert into demo_in(a
,b,c
)select
123,2,
4from dual where not exists
(select c from demo_in where c =4
);
用臨時表dual
來標記資料,然後插入到demo_in
表中。條件是c=4
,並且not exists
,也就是當c=4
條件滿足,則不插入。
Mysql插入資料,存在則更新,否則插入
mysql表中,有個聯合唯一索引 create table news visite id int 11 notnull auto increment comment 主鍵 news id bigint 11 default null comment 資訊id user id bigint 11 de...
存在就不插入 sqlserver插入資料
1 指定所要插入資料的列 insert into table name 列1,列2,values 值1,值2,insert into stu xm,xb,csrq,sfzh,age,lxdh,address,jxj,create time values 張三 男 1995 5 6 101101199...
mssql不存在便插入存在不執行操作
參考 在mssql中,在記錄不存在時插入記錄,如果存在則不執行操作 相關語句 建立表create table users userid varchar 50 primary key,username nvarchar 20 age intnot null 直接插入 insert into users...