mysql 已存在数据_MySQL跳过已存在的数据
一、背景
在使用MySQL進行插入的時候,遇到了一個場景:當插入的數據不再數據庫中的時候就插入,否則就跳過。
二、方法
我們可以使用下面的SQL語句進行處理,處理語句如下。在這個里面有幾個重要的地方,DUAL和insert的操作。
標準:
INSERT INTO table(primarykey, field1, field2, ...)SELECT key, value1, value2, ...FROMdualWHERE not exists (select * from table where primarykey = id);
例子:
INSERT INTO mygame (userId,gameId) SELECT 1,2 from DUAL WHERE not EXISTS (SELECT * FROM mygame WHERE userId=6 and gameId=1)
從上述SQL的例子中講述每一部分的內容及含義:
2.1 首先是下面的部分
(SELECT * FROM mygame WHERE userId=6 and gameId=1)
這部分的含義是從mygame中獲取用戶id為6同時游戲id為1的數據,這里的查詢語句作用就是看有沒有這個數據,因此是否查詢所有屬性不重要,可以直接設置為1,如下面的格式:
SELECT 1 FROM mygame WHERE userId=6 and gameId=1)
2.2 然后是DUAL查詢的部分
SELECT 1,2 from DUAL WHERE not EXISTS (SELECT 1 FROM mygame WHERE userId=6 and gameId=1)
這一部分我們使用了一個not exists的關鍵查詢,意思是不存在則選擇出數據,如果存在選擇就是空,這里有一個很重要部分就是DUAL表的查詢,這是一個虛空表,select的表頭和值都是一樣的。如我執行下面的SQL語句:
SELECT 1,9,0 from DUAL
結果
note:如果使用*號查詢會使得數據結果錯誤,所以這就是為什么說他是虛擬表的原因。
2.3 最后是insert部分
INSERT INTO mygame (userId,gameId) SELECT 1,2 from DUAL WHERE not EXISTS (SELECT * FROM mygame WHERE userId=6 and gameId=1)
我們將從虛空表中的數據獲取出來并插入到mygame中,插入的數據就是虛空表的數據,也就是我們設置的1,2的值,與正常的插入一樣,如果字段不完全,需要具體字段,如果完全可以省略插入的字段,但是要按照順序,如下面的情況:
INSERT INTO mygame SELECT 1,9,0 from DUAL WHERE not EXISTS (SELECT 1 FROM mygame WHERE userId=6 and gameId=1)
如果不完全就會出現下面的錯誤
三、總結
這種很有效的插入方法已經介紹完了,在使用的時候需要注意,DUAL表的字段查詢會輸出你設計的字段,從DUAL表中選取的數據就是你要插入的字段,否則就會一直添加。
直到修改為6,12為止,才會結束
四、參考
dual表介紹:
官方介紹:
其他方法:
總結
以上是生活随笔為你收集整理的mysql 已存在数据_MySQL跳过已存在的数据的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: mysql聚簇索引存储结构_MySQL聚
- 下一篇: bootstrap mysql分页_bo