【问题标题】:Postgresql insert if not exists如果不存在 Postgresql 插入
【发布时间】:2015-01-20 21:29:51
【问题描述】:

我对 SQL 很陌生,我得到的只是一个又一个的错误,所以任何帮助都将不胜感激。

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

我在 Google 上搜索过,在 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

【问题讨论】:

标签: sql postgresql


【解决方案1】:

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

【讨论】:

  • @a_horse_with_no_name 我有 LIMIT 1 个。
  • @a_horse_with_no_name 不过我之前的回答比较好,这太冗长了,这里有太多不必要的东西了。
  • @daryl 当然,NP :) 不用担心。
【解决方案2】:

不要将列放在括号中。

如果您查看收到的完整错误消息,那么 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;

一般来说,仅当括号确实必需

时才添加括号是个好主意

【讨论】:

  • @GordonLinoff:是的。因为insert 指定两个 列,而select 只有一个列,因此会产生错误:“INSERT has more target columns than expressions
  • 。 .谢谢,这澄清了它。
  • RETURNING id;的用途是什么?我们真的需要这个吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-10-13
  • 2018-09-17
  • 2022-11-07
  • 2013-08-14
相关资源
最近更新 更多