插入(如果不存在),否则返回id

毛罗·塔姆(Mauro Tamm)

有一些限制:

  1. 无法修改数据库
  2. 列不是唯一的
  3. 需要返回最后一个插入ID(RETURNING id
  4. 如果存在,则返回现有ID
  5. 将通过我们的自定义数据库库调用它(select中的值将作为PHP中的参数(?,?,?,!))

INSERT INTO tags (name, color, groupid)
SELECT  'test', '000000', 56
WHERE NOT EXISTS (
  SELECT text FROM tags WHERE name = 'test' AND groupid = 56
)
RETURNING id

这有效-直到我需要获取现有ID的地步。有了这个我只能得到插入的ID。如果未插入SELECT语句,是否可以返回该值?

更新:

DO $$
BEGIN
    IF NOT EXISTS (
      SELECT text FROM tags WHERE name = 'test' AND groupid = 56
    )
    THEN
      INSERT INTO tags (name, color, groupid)
          VALUES  ('test', '000000', 56) RETURNING id;
    ELSE
      RETURN SELECT text FROM tags WHERE name = 'test' AND groupid = 56;
    END IF;
END
$$

使用这种格式进行测试-但这以一些错误结尾:

RETURN cannot have a parameter in function returning void
加里

您可以使用CTE执行此操作。

信息中心具有源数据,因此请用您的PHP占位符替换那里的值。

如果存在现有记录,CTE将从并集的前半部分返回结果(因此将显示旧的ID),如果执行了插入操作,则后半部分将返回结果(因此将显示新的ID)。

WITH info (name, color, groupid) AS
  (values('test','000000',56)),
  trial AS (
    INSERT INTO tags(name, color, groupid)
      SELECT info.name, info.color, info.groupid
      FROM info
      WHERE NOT EXISTS (
        SELECT * FROM tags t2
        WHERE t2.name = info.name AND t2.groupid= info.groupid)
    RETURNING id)
SELECT tags.id
FROM tags
INNER JOIN info ON tags.name = info.name AND tags.groupid= info.groupid
UNION ALL
SELECT trial.id
FROM trial;

SQL Fiddle示例:http ://sqlfiddle.com/#!15/a7b0f/2

使用CTE的Postgres手册页

http://www.postgresql.org/docs/9.1/static/queries-with.html

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

Postgres:如果不存在则插入,否则返回该行

如果不存在则插入,否则返回值

MySQL 不存在则插入,否则返回id

获取文档ID(如果存在)或将其插入,并返回插入的文档ID(如果不存在)

MongoDB-如果不存在则插入,否则跳过

如果不存在则插入,否则删除MongoDB

SQL Server-如果不存在则插入,否则更新

插入(如果不存在),否则删除-使用ON DUPLICATE KEY

如果记录存在则返回ID,否则插入并返回ID

如果不存在则插入

如果不存在,则插入

如果不存在则插入

如果不存在则插入

插入表(如果不存在)并在两种情况下都返回ID

MySQL-插入值(如果不存在)或更新并返回ID

如果值不存在,则设置为null;否则,如果存在颠簸,则返回现有值

创建表并插入行(如果不存在),否则只需插入

JDBCTemplate:如果ID不存在,则更新或插入

如果行不存在则返回0,否则返回列值

如果不存在则插入不插入

如果不存在则插入,否则在Netezza中对其进行更新

如果不存在则插入,否则更新然后在旧记录上设置标志

MySQL插入数据,如果不存在,否则显示警告

如果不存在,则插入,否则显示消息不起作用

mongodb 插入多个文档,如果它们不存在,否则什么都不做

如果不存在则插入数据(来自2个表),否则更新

SQL为从另一个表返回的每个ID插入多行,如果该ID不存在该行

如果ID不存在,则附加到json文件,否则更改现有ID的值

将用户代理字符串的哈希存储在MySQL表中:如果不存在则插入,返回ID