Postgresql插入(如果不存在)
我对SQL非常陌生,我得到的只是一个接一个的错误,所以任何帮助都将不胜感激 我有一个标签表:id,姓名,slug 我用谷歌搜索过Stackoverflow,但对我来说什么都不管用。我试图创建一个不存在的标记,但无论它是创建的还是存在的,都会返回IDPostgresql插入(如果不存在),sql,postgresql,Sql,Postgresql,我对SQL非常陌生,我得到的只是一个接一个的错误,所以任何帮助都将不胜感激 我有一个标签表:id,姓名,slug 我用谷歌搜索过Stackoverflow,但对我来说什么都不管用。我试图创建一个不存在的标记,但无论它是创建的还是存在的,都会返回ID INSERT INTO tags (name, slug) SELECT ('Wow', 'wow') WHERE NOT EXISTS (SELECT id FROM tags WHERE slug = 'wow') RETURNING id;
INSERT INTO tags (name, slug)
SELECT ('Wow', 'wow')
WHERE NOT EXISTS (SELECT id FROM tags WHERE slug = 'wow')
RETURNING id;
以下是我的建议:不要将列放在括号中 如果你看到你收到的全部错误信息,那么Postgres实际上会告诉你出了什么问题 错误:INSERT的目标列多于表达式
提示:插入源是一个行表达式,其中包含的列数与插入所需的列数相同。你不小心用了额外的括号吗 表达式
('Wow','Wow')
只是一列,是一个匿名的“记录”,包含两个变量(有关详细信息,请参阅)
一般来说,只有在确实需要括号时才添加括号是一个好主意(1)只需删除括号即可。那应该能解决你的问题
INSERT INTO tags (name, slug)
SELECT 'Wow', 'wow'
WHERE NOT EXISTS (SELECT id FROM tags WHERE slug = 'wow')
RETURNING id;
(2) 试试这个。这也应该做到(即使来自子句实际上并不像其他人指出的那样需要)
@戈登林诺夫:是的。因为
insert
指定了两列,而select
只有一列,因此它会生成一个错误:“insert的目标列多于表达式”。谢谢,这就澄清了。返回id的用法是什么;?我们真的需要这个吗?@a_horse_和a_no_name我在这里限制为1。@a_horse_和a_no_name但我之前的答案更好,这太冗长了,这里有太多不必要的东西。@daryl当然,NP:)不用担心。可能是重复的
INSERT INTO tags (name, slug)
SELECT 'Wow', 'wow'
WHERE NOT EXISTS (SELECT id FROM tags WHERE slug = 'wow')
RETURNING id;
INSERT INTO tags (name, slug)
SELECT 'Wow', 'wow' FROM tags
WHERE NOT EXISTS (SELECT id FROM tags WHERE slug = 'wow')
LIMIT 1
RETURNING id;