首頁 > 軟體

MySQL中的insert ignore into使用

2022-08-18 14:02:56

MySQL中的insert ignore into

最近工作中,使用到了insert ignore into語法,感覺這個語法還是挺有用的,就記錄下來做個總結。

  • insert ignore into : 忽略重複的記錄,直接插入資料。

包括兩種場景:

1、插入的資料是主鍵衝突時

insert ignore into會給出warnings,show warnings就可以看到提示主鍵衝突;

[test]> create table tt(c1 int primary key, c2 varchar(50))engine = xx;
Query OK, 0 rows affected (0.21 sec)
 
[test]> insert into tt values(1, "aaa"), (2, "bbb"), (3, "ccc");
Query OK, 3 rows affected (0.02 sec)
Records: 3  Duplicates: 0  Warnings: 0
 
[test]> select * from tt;
+----+------+
| c1 | c2   |
+----+------+
|  1 | aaa  |
|  2 | bbb  |
|  3 | ccc  |
+----+------+
3 rows in set (0.01 sec)
 
[test]> 
[test]> insert ignore into tt values(1, "aaa"), (2, "bbb"), (3, "ccc");
Query OK, 0 rows affected, 3 warnings (0.01 sec)
Records: 3  Duplicates: 3  Warnings: 3
 
[test]> 
[test]> select * from tt;
+----+------+
| c1 | c2   |
+----+------+
|  1 | aaa  |
|  2 | bbb  |
|  3 | ccc  |
+----+------+
3 rows in set (0.00 sec)

使用insert ignore into語句時,如果主鍵衝突,只是提示"warnings"。

如果使用insert into語句時,如果主鍵衝突直接報錯。

2、沒有主鍵衝突時,直接插入資料

insert into 與 insert ignore into 都是直接插入資料

[test]> create table t2(c1 int, c2 varchar(50))engine = xxx;
Query OK, 0 rows affected (0.05 sec)
 
[test]> insert into t2 values(1, "aaa"), (2, "bbb"), (3, "ccc");
Query OK, 3 rows affected (0.03 sec)
Records: 3  Duplicates: 0  Warnings: 0
 
GreatDB Cluster[test]> select * from t2;
+------+------+
| c1   | c2   |
+------+------+
|    1 | aaa  |
|    2 | bbb  |
|    3 | ccc  |
+------+------+
3 rows in set (0.00 sec)
 
[test]> insert into t2 values(1, "aaa"), (2, "bbb"), (3, "ccc");
Query OK, 3 rows affected (0.02 sec)
Records: 3  Duplicates: 0  Warnings: 0
 
 
[test]> insert into t2 values(1, "aaa"), (2, "bbb"), (3, "ccc");
Query OK, 3 rows affected (0.02 sec)
Records: 3  Duplicates: 0  Warnings: 0
 
[test]> select * from t2;
+------+------+
| c1   | c2   |
+------+------+
|    1 | aaa  |
|    2 | bbb  |
|    3 | ccc  |
|    1 | aaa  |
|    2 | bbb  |
|    3 | ccc  |
|    1 | aaa  |
|    2 | bbb  |
|    3 | ccc  |
+------+------+
9 rows in set (0.00 sec)
 
[test]> insert ignore into t2 values(1, "aaa"), (2, "bbb"), (3, "ccc");
Query OK, 3 rows affected (0.03 sec)
Records: 3  Duplicates: 0  Warnings: 0

因此,insert ignore into主要是忽略重複的記錄,直接插入資料。

insert ignore into--跳坑

首先,SQL語句:

<insert id="addTerm" parameterType="String">
        insert ignore into term(term) VALUES (#{term})
</insert>

然後,資料庫表:

                                 

簡單的不能再簡單的一張表:解釋一下,id是自增的,同時也是主鍵,term就是term嘍,其他的外來鍵、索引什麼的都沒有。

要求是:不能使term重複插入;

剛開始認為就是判斷的插入的資料是否重複,然後發現不是這樣的,它判斷的是主鍵或者索引是否重複(更準確的來說是忽略主鍵衝突時報的錯誤)。

所以在這裡要說說這個自增的id了,因為在insert ignore into插入的時候你的現在將要插入的資料的id已經是增加一了,所以你的這個自增主鍵id是無論如何也不能相等的,所以自然你的資料也就不會聽話的把重複的資料不插入,這也就是為什麼,即使ignore時沒有插入資料它的自增的鍵也會跳過,所以這個要注意。

解決辦法就是新增個索引就歐克了唄

因為重複的時候它的自增的鍵依然會增加,所以當資料的重複率很高的時候,可以考慮把自增的鍵搞成自己控制的一個因素,手動自增,豈不美滋滋?

以上為個人經驗,希望能給大家一個參考,也希望大家多多支援it145.com。


IT145.com E-mail:sddin#qq.com