Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Postgresql插入(如果不存在)_Sql_Postgresql - Fatal编程技术网

Postgresql插入(如果不存在)

Postgresql插入(如果不存在),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;

我对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;

以下是我的建议:

不要将列放在括号中

如果你看到你收到的全部错误信息,那么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;