首页 > 解决方案 > SERIAL 与 NULL 一起使用,始终作为 IDENTITY 生成而不是

问题描述

Postgres 12:

CREATE TABLE l_table (
    id INT generated always as identity,
    w_id int NOT null references w_table(id),
    primary key (w_id, id)
)PARTITION BY LIST (w_id);

CREATE table l1 PARTITION OF l_table FOR VALUES IN (1);

insert into l1 (w_id) values (1);

我越来越:

ERROR: null value in column "id" violates not-null constraint

如果我INT generated always as identity用它代替SERIAL它。这很奇怪,因为在另一个表中生成的标识总是与 null 一起使用。使用as value 也不起作用。default

GAAI应该是替代SERIAL的SQL标准方式,即使它是建议的方式。我在这里想念什么?

谢谢。

标签: postgresqlidentity-columnpostgresql-12table-partitioning

解决方案


我在这里想念什么?

您试图直接插入分区表l1,而不是分区的l_table. 这将忽略父表上的标识列,尝试插入默认值null,并使每个标识列具有的非空约束失败。如果你改为

insert into l_table (w_id) values (1);

它将起作用并将插入的行路由到正确的分区中。

使用defaultas value 也不起作用。

显然,要做到这一点相当困难。如何默认分区标识列?在 dba.SE 上讨论了一些解决方法。


推荐阅读