如果不存在则INSERT,否则返回id

时间:2015-05-15 07:57:27

标签: php sql postgresql

有一些限制:

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

3 个答案:

答案 0 :(得分:3)

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

info cte包含源数据,因此将值替换为PHP的占位符。

如果存在现有记录,CTE将返回联盟前半部分的结果(因此将显示旧ID),如果执行插入,CTE将返回后半部分(因此将显示新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小提琴示例:http://sqlfiddle.com/#!15/a7b0f/2

使用CTE的Postgres手册页

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

答案 1 :(得分:-2)

您可以使用IF语句执行此操作。

IF NOT EXISTS(SELECT text FROM tags WHERE name = 'test')
BEGIN
  INSERT INTO tags (name, color, groupid)
  VALUES ('test', '000000', 56)
  SET @textId = SCOPE_IDENTITY()
END
ELSE
BEGIN
  SELECT @textId = ID FROM tags WHERE name = 'test'
END

您必须根据自己的要求对上述查询进行必要的更改。

答案 2 :(得分:-3)

如果name是唯一的:

INSERT INTO `tags` (name, color, groupid) VALUES ('test', '000000', 56)
  ON DUPLICATE KEY UPDATE id=LAST_INSERT_ID(id), `name`='test';
SELECT LAST_INSERT_ID();