使用"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>
insertinto 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)
如果更新多條記錄可以向下面這樣寫
insertinto 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 這樣識別符號的內容即為衝突部分內容。確定保留 後,刪除掉識別符號。儲存內容。...