mysql 已存在数据_MySQL跳过已存在的数据
一、背景
在使用MySQL進(jìn)行插入的時(shí)候,遇到了一個(gè)場(chǎng)景:當(dāng)插入的數(shù)據(jù)不再數(shù)據(jù)庫(kù)中的時(shí)候就插入,否則就跳過(guò)。
二、方法
我們可以使用下面的SQL語(yǔ)句進(jìn)行處理,處理語(yǔ)句如下。在這個(gè)里面有幾個(gè)重要的地方,DUAL和insert的操作。
標(biāo)準(zhǔn):
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的例子中講述每一部分的內(nèi)容及含義:
2.1 首先是下面的部分
(SELECT * FROM mygame WHERE userId=6 and gameId=1)
這部分的含義是從mygame中獲取用戶id為6同時(shí)游戲id為1的數(shù)據(jù),這里的查詢語(yǔ)句作用就是看有沒(méi)有這個(gè)數(shù)據(jù),因此是否查詢所有屬性不重要,可以直接設(shè)置為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)
這一部分我們使用了一個(gè)not exists的關(guān)鍵查詢,意思是不存在則選擇出數(shù)據(jù),如果存在選擇就是空,這里有一個(gè)很重要部分就是DUAL表的查詢,這是一個(gè)虛空表,select的表頭和值都是一樣的。如我執(zhí)行下面的SQL語(yǔ)句:
SELECT 1,9,0 from DUAL
結(jié)果
note:如果使用*號(hào)查詢會(huì)使得數(shù)據(jù)結(jié)果錯(cuò)誤,所以這就是為什么說(shuō)他是虛擬表的原因。
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)
我們將從虛空表中的數(shù)據(jù)獲取出來(lái)并插入到mygame中,插入的數(shù)據(jù)就是虛空表的數(shù)據(jù),也就是我們?cè)O(shè)置的1,2的值,與正常的插入一樣,如果字段不完全,需要具體字段,如果完全可以省略插入的字段,但是要按照順序,如下面的情況:
INSERT INTO mygame SELECT 1,9,0 from DUAL WHERE not EXISTS (SELECT 1 FROM mygame WHERE userId=6 and gameId=1)
如果不完全就會(huì)出現(xiàn)下面的錯(cuò)誤
三、總結(jié)
這種很有效的插入方法已經(jīng)介紹完了,在使用的時(shí)候需要注意,DUAL表的字段查詢會(huì)輸出你設(shè)計(jì)的字段,從DUAL表中選取的數(shù)據(jù)就是你要插入的字段,否則就會(huì)一直添加。
直到修改為6,12為止,才會(huì)結(jié)束
四、參考
dual表介紹:
官方介紹:
其他方法:
總結(jié)
以上是生活随笔為你收集整理的mysql 已存在数据_MySQL跳过已存在的数据的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: mysql聚簇索引存储结构_MySQL聚
- 下一篇: bootstrap mysql分页_bo