1

我有一个使用 UUID 作为主键的表。像这样插入新行

INSERT INTO a ( id, ... ) VALUES ( uuid_generate_v4(), ...)

现在我实际上只想在插入中没有提供 ID(NULL或空字符串)时生成 UUID

可以写这样的东西吗?

INSERT INTO a ( id, ... ) VALUES ( $1 || uuid_generate_v4(), ...)
4

3 回答 3

5

coalesce() 函数将使用第一个非空值。如果 $1 为空,则 coalesce() 将使用 uuid_generate_v4()。否则,它将尝试使用 $1。

insert into a (id, ... ) values 
(coalesce($1, uuid_generate_v4()), ... );
于 2013-07-11T16:41:13.057 回答
1

检查 IF 函数,在某些 RDBMS 中可用。

IF( $1 = NULL, $1, uuid_generate_v4())

$1作为占位符。

如果你喜欢它们,你也可以设置一个触发器,但大多数情况下它们是不受欢迎的。

而且还有IFNULL( $1, uuid_generate_v4() )

更新:我很惊讶 PostgreSQL 不支持IF我认为的标准。

因此,正如其他答案中提到的,COALESCE( $1, uuid_generate_v4() )可能是最好的选择。

于 2013-07-11T16:34:07.537 回答
1

您可以更改表或使用列的默认值创建表。

CREATE TABLE thing (
  id uuid DEFAULT uuid_generate_v4(),
  updated timestamp DEFAULT now()
);
于 2013-07-11T16:46:34.513 回答