【发布时间】:2016-08-26 11:47:59
【问题描述】:
我有使用 UUID 的表。我希望能够插入带有或不带有 UUID 的新行,因为有时客户端会生成 UUID,而有时它不会。
每张桌子的核心都是这个:
CREATE TABLE IF NOT EXISTS person (
id UUID PRIMARY KEY DEFAULT gen_random_uuid()
);
我正在尝试使用函数来插入行。我希望能够提供一个 NULL id 并获得一个默认值(生成的 UUID)。我有这样的事情:
CREATE OR REPLACE FUNCTION create_person(
id UUID
) RETURNS BOOLEAN LANGUAGE plpgsql SECURITY DEFINER AS $$
BEGIN
INSERT INTO person( id )
VALUES (
COALESCE(id,default)
);
RETURN FOUND;
END;
$$;
我试过了:
INSERT INTO person ( id ) VALUES (
COALESCE(id, default),
);
还有这个:
INSERT INTO person ( id ) VALUES (
CASE WHEN id IS NULL THEN default ELSE id END
);
这可行,但它重复了 gen_random_uuid() 代码:
INSERT INTO person ( id ) VALUES (
COALESCE(id, gen_random_uuid()),
);
同样,这也有效,但有同样的问题:
INSERT INTO person ( id ) VALUES (
CASE WHEN id IS NULL THEN gen_random_uuid() ELSE id END
);
有没有办法让我不必重复 gen_random_uuid() 代码?
使用plpgsql 会更好吗?
【问题讨论】:
-
当您使用 PL/pgSQL 时,我会使用
if id is not null then insert .. values (id) else insert ... values (default) -
这是什么
default?我看不到它在哪里定义。那是可见的吗?你能打印出来吗?另一个角度是:我会尝试将此default命名为其他不是 SQL 关键字的名称,例如default_value。 -
@tamas-rev 这是我想要的
default关键字。我希望 Postgres 在那里插入一个默认值(在 CREATE TABLE 中定义)。 -
我认为触发器可以帮助你。例如,他们可以为您运行
before insert。我无法测试它,因为我的机器上没有 postgres。不过,this page 是一个不错的起点。 -
幸运的第三次我认为 tamas 有正确的答案。
BEFORE INSERT触发器让您可以更改任何插入的值并将空值替换为新值。
标签: sql postgresql plpgsql