【问题标题】:SERIAL works with NULL, GENERATED ALWAYS AS IDENTITY notSERIAL 与 NULL 一起使用,始终作为 IDENTITY 生成而不是
【发布时间】:2020-11-01 07:04:34
【问题描述】:

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 一起使用。使用default 作为值也不起作用。

GAAI应该是替代SERIAL的SQL标准方式,甚至是建议的方式。我在这里错过了什么?

谢谢。

【问题讨论】:

  • 改用insert into l_table (w_id) values (1); - 插入分区似乎不会默认标识列
  • 看起来可行。请回答这个问题,我会检查它。谢谢!

标签: postgresql identity-column postgresql-12 table-partitioning


【解决方案1】:

我在这里错过了什么?

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

insert into l_table (w_id) values (1);

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

使用default 作为值也不起作用。

显然这很难做到。 How to DEFAULT Partitioned Identity Column? over at dba.SE 讨论了一些解决方法。

【讨论】:

    猜你喜欢
    • 2015-03-22
    • 2016-11-20
    • 1970-01-01
    • 2017-02-02
    • 1970-01-01
    • 1970-01-01
    • 2012-09-29
    • 2013-02-17
    • 1970-01-01
    相关资源
    最近更新 更多