如果不存在Postgresql插入

时间:2014-11-22 22:38:07

标签: sql postgresql

我是SQL的新手,我得到的只是错误后的错误,所以任何帮助都会受到赞赏。

我有一个标签表:id,name,slug

我已经谷歌了,在Stackoverflow上搜索过,但没有什么对我有用。我正在尝试创建一个标签,如果它不存在,但总是返回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

2 个答案:

答案 0 :(得分:16)

不要将列放在括号中。

如果你看一下你得到的完整错误信息,那么Postgres实际上会告诉你出了什么问题。

  

错误:INSERT的目标列多于表达式
   提示:插入源是一个行表达式,包含INSERT期望的相同列数。 您是否意外使用了额外的括号?

表达式('Wow', 'wow')只是一个列,一个匿名"记录"有两个变量(详见the manual

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

一般来说,只有当它们真的需要时才添加括号

是个好主意。

答案 1 :(得分:4)

(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;