我无法在PostgreSQL中创建日期分区表

6ss1mwsb  于 2024-01-07  发布在  PostgreSQL
关注(0)|答案(1)|浏览(141)

我尝试使用下面的查询在PostgreSQL中创建分区表,并按日期(01~31)存储数据。

CREATE TABLE test (
    aaa varchar(4) NOT NULL, 
    bbb int4 NOT NULL,
    ccc timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
    CONSTRAINT "PK_test" PRIMARY KEY (aaa, bbb)
) PARTITION BY RANGE(to_char(ccc, 'DD'));

CREATE TABLE test_01 PARTITION OF test FOR VALUES FROM ('01') TO ('02');
...
CREATE TABLE test_31 PARTITION OF test FOR VALUES FROM ('31') TO ('32');

字符串
但是,PARTITION BY RANGE(to_char(ccc, 'DD'))中出现以下错误。

functions in partition key expression must be marked IMMUTABLE


如何按日期对表进行分区?

y1aodyip

y1aodyip1#

使用表达式作为分区键不允许使用主键约束。因此,我们从根表中删除了私钥约束,并将该约束添加到叶表中。

CREATE TABLE test (
    aaa varchar(4) NOT NULL, 
    bbb int4 NOT NULL,
    ccc timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP
) PARTITION BY RANGE(EXTRACT(DAY FROM ccc));

DO $$ 
BEGIN
    FOR i IN 1..31 LOOP
        EXECUTE 'CREATE TABLE test_' || i || ' PARTITION OF test FOR VALUES FROM (' || i || ') TO (' || i+1 || ')';
        EXECUTE 'ALTER TABLE test_' || i || ' ADD PRIMARY KEY (aaa, bbb)';
    END LOOP;
END $$;

字符串

相关问题