有一些限制:
RETURNING id
)的
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
答案 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手册页
答案 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();