关于sql:如果不存在Postgresql插入

Postgresql insert if not exists

我对SQL非常陌生,我所得到的只是一个接一个的错误,所以任何帮助都会很感激。

我有个标签表:身份证,名字,鼻涕虫

我在stackoverflow上搜索过google,但没什么对我有用的。我试图创建一个标签,如果它不存在,但总是返回ID,无论它是创建的还是存在的。

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

以下是我的资料:http://sqlpiddle.com/!15/4050A/18


不要将列放在括号中。

如果你看到你得到的全部错误信息,那么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')只是一个单列,一个匿名的"记录",包含两个变量(有关详细信息,请参阅手册)。

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

一般来说,最好只在确实需要括号的情况下添加括号。


(1)拆下支架即可。这应该能解决你的问题。

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

(2)试试这个。也应该这样做(即使是来自正如其他人指出的那样,实际上并不需要子句)。

1
2
3
4
5
INSERT INTO tags (name, slug)
SELECT 'Wow', 'wow' FROM tags
WHERE NOT EXISTS (SELECT id FROM tags WHERE slug = 'wow')
LIMIT 1
RETURNING id;