MYSQL插入處理重複鍵值的幾種方法

2021-07-27 07:23:49 字數 3614 閱讀 4577

當unique列在乙個unique鍵上插入包含重複值的記錄時,預設insert的時候會報1062錯誤,mysql有三種不同的處理方法,下面我們分別介紹。

先建立2個測試表,在id列上建立unique約束。

mysql> create table test1(id int,name varchar(5),type int,primary key(id));

query ok, 0 rows affected (0.01 sec)

mysql> create table test2(id int,name varchar(5),type int,primary key(id));

query ok, 0 rows affected (0.01 sec)

mysql> select * from test1;

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

| id  | name | type |

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

| 101 | aaa  |    1 | 

| 102 | bbb  |    2 | 

| 103 | ccc  |    3 | 

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

3 rows in set (0.00 sec)

mysql> select * from test2;

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

| id  | name | type |

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

| 201 | aaa  |    1 | 

| 202 | bbb  |    2 | 

| 203 | ccc  |    3 | 

| 101 | ***  |    5 | 

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

4 rows in set (0.00 sec)

1、replace into

發現重複的先刪除再插入,如果記錄有多個字段,在插入的時候如果有的字段沒有賦值,那麼新插入的記錄這些欄位為空。

mysql> replace into test1(id,name)(select id,name from test2);

query ok, 5 rows affected (0.04 sec)

records: 4  duplicates: 1  warnings: 0

mysql> select * from test1;

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

| id  | name | type |

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

| 101 | ***  | null | 

| 102 | bbb  |    2 | 

| 103 | ccc  |    3 | 

| 201 | aaa  | null | 

| 202 | bbb  | null | 

| 203 | ccc  | null | 

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

6 rows in set (0.00 sec)

需要注意的是,當你replace的時候,如果被插入的表如果沒有指定列,會用null表示,而不是這個表原來的內容。如果插入的內容列和被插入的表列一樣,則不會出現null。例如

mysql> replace into test1(id,name,type)(select id,name,type from test2);

query ok, 8 rows affected (0.04 sec)

records: 4  duplicates: 4  warnings: 0

mysql> select * from test1;

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

| id  | name | type |

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

| 101 | ***  |    5 | 

| 102 | bbb  |    2 | 

| 103 | ccc  |    3 | 

| 201 | aaa  |    1 | 

| 202 | bbb  |    2 | 

| 203 | ccc  |    3 | 

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

6 rows in set (0.00 sec)

如果insert的時候,需要保留被插入表的列,只更新指定列,那麼就可以使用第二種方法。

2、insert into on duplicate key update

發現重複的是更新操作。在原有記錄基礎上,更新指定字段內容,其它字段內容保留。例如我只想插入test2表的id,name欄位,但是要保留test1表的type欄位:

mysql> insert into test1(id,name,type)(select id,name,type from test2) on duplicate key update test1.name=test2.name;

query ok, 5 rows affected (0.04 sec)

records: 4  duplicates: 1  warnings: 0

mysql> select * from test1;

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

| id  | name | type |

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

| 101 | ***  |    1 | 

| 102 | bbb  |    2 | 

| 103 | ccc  |    3 | 

| 203 | ccc  |    3 | 

| 202 | bbb  |    2 | 

| 201 | aaa  |    1 | 

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

6 rows in set (0.00 sec)

如果insert的時候,只想插入原表沒有的資料,那麼可以使用第三種方法。

3、ignore into

判斷是否存在,存在不插入,否則插入。很容易理解,當插入的時候,違反唯一性約束,mysql不會嘗試去執行這條語句。例如:

mysql> insert ignore into test1(id,name,type)(select id,name,type from test2);

query ok, 3 rows affected (0.01 sec)

records: 4  duplicates: 1  warnings: 0

mysql> select * from test1;

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

| id  | name | type |

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

| 101 | aaa  |    1 | 

| 102 | bbb  |    2 | 

| 103 | ccc  |    3 | 

| 203 | ccc  |    3 | 

| 202 | bbb  |    2 | 

| 201 | aaa  |    1 | 

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

6 rows in set (0.00 sec)

MYSQL插入處理重複鍵值的幾種方法

當unique列在乙個unique鍵上插入包含重複值的記錄時,預設insert的時候會報1062錯誤,mysql有三種不同的處理方法,下面我們分別介紹。先建立2個測試表,在id列上建立unique約束。mysql createtabletest1 idint,namevarchar 5 typein...

mysql插入防重複

普遍解決方法,要麼靠資料庫sql,要麼就是靠程式控制,新增分布式鎖,當然資料庫事務也需要配合使用 1 程式方面,新增version redis 或者資料庫冗餘表 2 資料庫方面 a 插入時新增exist判斷,比如 insert into test name select 4 from dual wh...

mysql 計算非重複 MySQL 不重複插入

sql unique 約束 unique 約束唯一標識資料庫表中的每條記錄。unique 和 primary key 約束均為列或列集合提供了唯一性的保證。primary key 擁有自動定義的 unique 約束。請注意,每個表可以有多個 unique 約束,但是每個表只能有乙個 primary ...