SERIAL 与 NULL 一起工作,GENERATED ALWAYS AS IDENTITY not
SERIAL works with NULL, GENERATED ALWAYS AS IDENTITY not
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
如果我用 SERIAL
替换 INT generated always as identity
它 有效 。这很奇怪,因为在另一个 table 中生成的 always as identity 与 null 一起使用。使用 default
作为值也不起作用。
GAAI 应该是 SQL 替换 SERIAL 的标准方式,甚至是建议的方式。我在这里错过了什么?
谢谢。
What am I missing here?
您正在尝试直接插入分区 table l1
,而不是分区 l_table
。这将忽略父级 table 上的标识列,尝试插入默认值 null
,并使每个标识列都具有的非空约束失败。如果你改为
insert into l_table (w_id) values (1);
它将工作并将插入的行路由到正确的分区。
Using default
as value does not work either.
显然很难做到这一点。 How to DEFAULT Partitioned Identity Column? 在 dba.SE 讨论了一些解决方法。
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
如果我用 SERIAL
替换 INT generated always as identity
它 有效 。这很奇怪,因为在另一个 table 中生成的 always as identity 与 null 一起使用。使用 default
作为值也不起作用。
GAAI 应该是 SQL 替换 SERIAL 的标准方式,甚至是建议的方式。我在这里错过了什么?
谢谢。
What am I missing here?
您正在尝试直接插入分区 table l1
,而不是分区 l_table
。这将忽略父级 table 上的标识列,尝试插入默认值 null
,并使每个标识列都具有的非空约束失败。如果你改为
insert into l_table (w_id) values (1);
它将工作并将插入的行路由到正确的分区。
Using
default
as value does not work either.
显然很难做到这一点。 How to DEFAULT Partitioned Identity Column? 在 dba.SE 讨论了一些解决方法。