2015-09-08 33 views
0

我想插入一個名爲「foo」的標籤,除非它已經存在。所以我構建了以下查詢:爲什麼我不能在INSERT中使用WHERE NOT EXISTS?

INSERT INTO "tag" ("name") VALUES ('foo') 
WHERE NOT EXISTS (SELECT 1 FROM "tag" WHERE ("tag"."name" = 'foo')); 

但這將失敗,並出現以下錯誤:

ERROR: syntax error at or near "WHERE" 
LINE 1: INSERT INTO "tag" ("name") VALUES ('foo') WHERE NOT EXISTS (... 
               ^

我不明白的地方與查詢問題。特別是,因爲我可以提供一個子查詢,而不是VALUES突然查詢是完全沒有問題:

INSERT INTO "tag" ("name") SELECT 'foo' AS name 
WHERE NOT EXISTS (SELECT 1 FROM "tag" WHERE ("tag"."name" = 'foo')); 

這導致:

Query returned successfully: 0 rows affected, 11 ms execution time. 

它的0行,因爲標籤已經存在。

+0

[MySQL的條件插入]的可能重複(http://stackoverflow.com/questions/913841/mysql-conditional-insert) –

+0

@BasileStarynkevitch:關於併發問題,MySQL的行爲不同。 –

回答

3

你可以,你只需要使用INSERT INTO ... SELECT ...表格。

INSERT INTO "tag" ("name") 
SELECT 'foo' 
WHERE NOT EXISTS (SELECT 1 FROM "tag" WHERE ("tag"."name" = 'foo')); 

但是,它不會做你想做的。至少不在併發工作負載下。您仍然可以獲得唯一的違規或重複的插入。

參見:

+0

爲什麼'VALUES'的語法無效,但涉及子查詢的是? –

+1

@OliverSalzburg'VALUES'沒有'WHERE'子句。這是一個或多個元組的簡單列表。該語法不允許其他任何事情。所以,基本上,它是無效的,因爲它被指定爲不合法。見http://www.postgresql.org/docs/current/static/sql-values.html –

+0

啊!我沒有意識到'WHERE'屬於'VALUES'。感謝您的幫助:) –

相關問題