【发布时间】:2015-05-15 07:57:26
【问题描述】:
有一些限制:
- 无法修改数据库
- 列不是唯一的
- 需要返回最后一个插入 id (
RETURNING id) - 如果存在,返回现有id
- 它将通过我们的自定义 db 库调用(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
【问题讨论】:
-
您可以通过创建一个命名函数而不是
DO语句来避免最后一个错误,该语句具有完全相同的主体,例如CREATE FUNCTION foo(text, text, int) RETURNS int LANGUAGE plpgsql AS $$ ....;然后你会以SELECT foo(?, ?, ?) AS id的形式执行它 -
为了测试我将它创建为一个函数,结果有点不同:'错误:查询没有结果数据的目的地'
-
那是因为
RETURNING id就像SELECT,你需要告诉函数RETURN整个INSERT语句的结果,我想。 -
嗨,我对 PostgreSql 不是很熟悉,但我有一些空闲时间想出了这个sqlfiddle.com/#!15/9f96a,所以你可以试试它是否适合你,这将插入新值和返回值 - 1 如果表中已经不存在值并且如果有值它将返回值 id
标签: php sql postgresql