小编aka*_*xer的帖子

PostgreSQL 如何默认分区标识列?

PostgreSQL 11
为分区表上的标识列生成默认值的最佳方法是什么。
例如

CREATE TABLE data.log
(
  id              BIGINT GENERATED ALWAYS AS IDENTITY
                  (
                    INCREMENT BY 1
                    MINVALUE -9223372036854775808
                    MAXVALUE 9223372036854775807
                    START WITH -9223372036854775808
                    RESTART WITH -9223372036854775808
                    CYCLE
                  ),
  epoch_millis    BIGINT NOT NULL,
  message         TEXT NOT NULL

) PARTITION BY RANGE (epoch_millis);

CREATE TABLE data.foo_log
PARTITION OF data.log
(
  PRIMARY KEY (id)
)
FOR VALUES FROM (0) TO (9999999999);
Run Code Online (Sandbox Code Playgroud)

如果我做:

INSERT INTO data.foo_log (epoch_millis, message)
VALUES (1000000, 'hello');
Run Code Online (Sandbox Code Playgroud)

我得到:

错误:“id”列中的空值违反了非空约束
详细信息:失败的行包含(null,1000000,hello)。
SQL状态:23502

因为默认生成的值不会应用于分区,除非我将其插入到根表中,如下所示:

INSERT INTO data.log (epoch_millis, message)
VALUES …
Run Code Online (Sandbox Code Playgroud)

postgresql partitioning identity postgresql-11

6
推荐指数
1
解决办法
4722
查看次数