2014-11-22 76 views
7

我对SQL很陌生,而且我得到的所有错误都是错误,所以任何帮助将不胜感激。Postgresql插入如果不存在

我有一个标签表:ID,姓名,蛞蝓

我已经Google'd,搜索#2,但没有为我工作。我试图创建一个标签,如果它不存在,但总是返回该ID是否已创建或存在。

INSERT INTO tags (name, slug) 
SELECT ('Wow', 'wow') 
WHERE NOT EXISTS (SELECT id FROM tags WHERE slug = 'wow') 
RETURNING id; 

这是我有:http://sqlfiddle.com/#!15/4050a/18

回答

13

不要把列在括号中。

如果你看看你会得到完整的错误消息,然后Postgres的实际上告诉了你什么是错的。

ERROR: INSERT has more target columns than expressions
Hint: The insertion source is a row expression containing the same number of columns expected by the INSERT. Did you accidentally use extra parentheses?

表达('Wow', 'wow')只是列,一个匿名的“记录”两个变量(见the manual了解详细信息)

INSERT INTO tags (name, slug) 
SELECT 'Wow', 'wow' 
WHERE NOT EXISTS (SELECT id FROM tags WHERE slug = 'wow') 
RETURNING id; 

一般来说这是只有当加括号是一个好主意他们真的需要

+0

@GordonLinoff:是的。因为'insert'指定了*两个*列,而'select'只有一个列,因此它会产生一个错误:“* INSERT的目标列多于表达式*” – 2014-11-22 22:45:47

+0

。 。谢谢,这说明了它。 – 2014-11-22 23:18:51

3

(1)只需卸下支架。这应该可以解决你的问题。

INSERT INTO tags (name, slug) 
SELECT 'Wow', 'wow' 
WHERE NOT EXISTS (SELECT id FROM tags WHERE slug = 'wow') 
RETURNING id; 

(2)试试这个。这也应该做到这一点(即使其他人指出,实际上并不需要一个FROM
条款)。

INSERT INTO tags (name, slug) 
SELECT 'Wow', 'wow' FROM tags 
WHERE NOT EXISTS (SELECT id FROM tags WHERE slug = 'wow') 
LIMIT 1 
RETURNING id; 
+0

@a_horse_with_no_name我在那里有限制1。 – 2014-11-22 22:48:54

+0

@a_horse_with_no_name但我以前的回答比较好,这太冗长了,太多不必要的东西在这里。 – 2014-11-22 22:49:22

+0

@daryl当然,NP :)不用担心。 – 2014-11-22 22:54:35