我是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;
答案 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;