没有简单的方法json_populate_record
可以返回一个表示“生成这个值”的标记。
PostgreSQL不允许您插入NULL
以指定应生成的值。如果您要求NULL
Pg 期望意味着 NULL
并且不想对您进行第二次猜测。此外,生成一个没有NOT NULL
约束的列是完全可以的,在这种情况下插入它是完全可以的NULL
。
如果您想让 PostgreSQL 使用表默认值作为值,有两种方法可以做到这一点:
- 从
INSERT
列列表中省略该行;或者
- 显式写入
DEFAULT
,仅在VALUES
表达式中有效
由于您不能VALUES(DEFAULT, ...)
在这里使用,您唯一的选择是从INSERT
列列表中省略该列:
regress=# create table test (id serial primary key, name varchar(50));
CREATE TABLE
regress=# insert into test(name) select name from json_populate_record(NULL::test, '{"name": "John"}');
INSERT 0 1
是的,这意味着您必须列出这些列。事实上,两次,一次在SELECT
列表中,一次在INSERT
列列表中。
为了避免这个 PostgreSQL 需要有一种方法来指定DEFAULT
记录的值,因此json_populate_record
可以返回DEFAULT
而NULL
不是未定义的列。这可能不是您对所有列的预期,并且会导致在表达式中未使用DEFAULT
时如何处理的问题。json_populate_record
INSERT
所以我想json_populate_record
对于生成键的行可能没有你希望的那么有用。