insert時出現主鍵衝突的處理方法

2022-07-13 07:57:14 字數 3116 閱讀 6014

使用"insert into"語句進行資料庫操作時可能遇到主鍵衝突,使用者需要根據應用場景進行忽略或者覆蓋等操作。總結下,有三種解決方案來避免出錯。

測試表:

create table `device` (

`devid` mediumint(8) unsigned not null auto_increment,

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

`spec_char` varchar(11) default '0',

primary key (`devid`)

) engine=innodb

1. 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'

forkey

'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當遇到主鍵衝突時,不更改原紀錄,也不報錯

2. 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)

3. insert into ... on duplicate key update

其實這個是原本需要執行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)

如果更新多條記錄可以向下面這樣寫

insert

into device values(1, "dead", "ccc") on duplicate key

update status =

'drain

', spec_char = "cccc"

UPDATE 時主鍵衝突引發的思考

假設有乙個表,結構如下 mysql create table a id int 10 unsigned not null auto increment,id2 int 10 unsigned not null default 0 primary key id engine myisam 該表中只有6...

UPDATE 時主鍵衝突引發的思考

假設有乙個表,結構如下 mysql create table a id int 10 unsigned not null auto increment,id2 int 10 unsigned not null default 0 primary key id engine myisam 該表中只有6...

Git git push時出現檔案衝突的解決辦法

git push 時出現檔案衝突的解決辦法 push時出現如下提示,此情況為本地倉庫檔案與遠端倉庫檔案出現了衝突。解決辦法 1.執行 git pull 命令 2.會看到如下提示,根據提示找到衝突檔案。3.檔案 現 head 這樣識別符號的內容即為衝突部分內容。確定保留 後,刪除掉識別符號。儲存內容。...