資料庫主鍵衝突解決

2021-08-11 14:41:03 字數 3187 閱讀 9035

參考:

順便介紹一種剛發現的解決360doc無法複製的問題:

右擊——檢視源**——全部複製——新建乙個html文件,貼上進去用瀏覽器開啟即可

新增資料的基本語法為:

insert

into + 表名 + [(字段列表)] + values (值列表);

在資料插入的時候,假設主鍵對應的值已經存在,則插入失敗!這就是主鍵衝突。

當主鍵存在衝突(duplicate key)的時候,可以選擇性的進行處理,即忽略、更新或者替換。

insert

ignore

into

遇主鍵衝突,保持原紀錄,忽略新插入的記錄。

mysql> select * from device ;

+-------+--------+-------------+

| devid | status | spec_char |

+-------+--------+-------------+

| 1 | dead | zhonghuaren |

| 2 | dead | zhong |

+-------+--------+-------------+

2 rows in set (0.00 sec)

mysql> insert into device values (1,'alive','yangting');

error

1062 (23000): duplicate entry '1' for key 'primary'

mysql> insert ignore into device values (1,'alive','yangting');

query

ok, 0 rows affected (0.00 sec)

mysql> select * from device ;

+-------+--------+-------------+

| devid | status | spec_char |

+-------+--------+-------------+

| 1 | dead | zhonghuaren |

| 2 | dead | zhong |

+-------+--------+-------------+

2 rows in set (0.00 sec)

可見 insert ignore into當遇到主鍵衝突時,不更改原紀錄,也不報錯

replace

into

遇主鍵衝突,替換原紀錄,即先刪除原紀錄,後insert新紀錄

mysql> replace  into device values (1,'alive','yangting');

query

ok, 2 rows affected (0.00 sec)

mysql> select * from device ;

+-------+--------+-----------+

| devid | status | spec_char |

+-------+--------+-----------+

| 1 | alive | yangting |

| 2 | dead | zhong |

+-------+--------+-----------+

2 rows in set (0.00 sec)

insert

into ... on

duplicate

keyupdate

其實這個是原本需要執行3條sql語句(select,insert,update),縮減為1條語句即可完成。

if (select * from where 存在)  else
如:

mysql> insert into device values (1,'readonly','yang'

) on duplicate key update status ='drain';

query ok, 2

rows affected (0.00 sec)

上面語句偽**表示即為

if (select * from device where devid=1)  else
很明顯,devid=1 是有的,這樣就執行update操作

mysql> select * from device ;

+-------+--------+-----------+

| devid | status | spec_char |

+-------+--------+-----------+

| 1 | drain | yangting |

| 2 | dead | zhong |

+-------+--------+-----------+

2 rows in set (0.00 sec)

測試表:

create

table

`device` (

`devid` mediumint(8) unsigned

notnull auto_increment,

`status` enum('alive','dead','down','readonly','drain') default

null,

`spec_char`

varchar(11) default

'0',

primary key (`devid`)

) engine=innodb

在專案中,比如插入一條user資訊,主鍵採用隨機uuid的衝突解決。

可以考慮採用第一種忽略的方式,當主鍵衝突,資料庫插入語句的返回值為0,然後我們判斷資料庫插入的返回值,如果為0,則重新生成主鍵,再次進行插入,直到完成插入操作!

何必等明天

出處:

分類: 

資料庫

資料庫同時更新多個資料出現主鍵衝突

在有序的資料庫列表中,經常會使用到主鍵作為排序的某列。有時候,在刪除或者插入資料的時候,需要將所有相關的資料進行更新。如果是簡單的使用update函式,會出現衝突,如在某個資料庫info中,儲存的資料為 idvalue110 320530 240450 假設id為主鍵,因為某個原因,需要將id 1的...

名字空間解決資料庫衝突問題

任何的程式設計都離不開資料庫的應用,資料庫訪問方式有ado dao odbc rdo bde.正因為有這麼多的資料庫訪問方式,往往由於資料庫方式的不同其達到的功能也不同,乙個大型軟體專案各個模組的不同或乙個開發小組各個成員掌握的資料庫訪問方式熟練程度的不同,都會出現乙個軟體專案使用幾種資料庫訪問方式...

主鍵衝突的解決方案

現象 高併發場景下,入庫時出現主鍵衝突,此主鍵並非自增主鍵,而是由三個字段組成的聯合主鍵。業務邏輯 新來的資料提取的主鍵在資料庫裡沒有,就直接插入,即執行insert 如果資料庫中存在相同主鍵,則用新的資料更新資料庫中已有的資料,即執行update。場景 多伺服器,多執行緒 目標 實現乙個類似ups...