首页 > 解决方案 > 如何在 Oracle 的间隔分区表中存储 NULL 值?

问题描述

我们使用分区来删除旧数据(Oracle 称之为ILM)。有一列带有“最佳日期”,之后将删除分区。

为了避免手动(或按脚本)添加分区,我们使用间隔分区:

CREATE TABLE my_table (
  id NUMBER NOT NULL PRIMARY KEY,
  --... other columns ...
  t DATE
) PARTITION BY RANGE (t) INTERVAL(NUMTODSINTERVAL(7, 'DAY')) (
  PARTITION PRE2018 VALUES LESS THAN (DATE '2018-01-01')
);

INSERT INTO my_table(id, t) VALUES (1, SYSDATE);
-- 1 row inserted.

...效果很好,但我们不能将分区日期保留为NULL

INSERT INTO my_table(id, t) VALUES (2, NULL);
-- ORA-14300: partitioning key maps to a partition outside maximum permitted number of partitions

如何解决?

标签: sqloracleoracle11g

解决方案


例如,您可以这样做:

CREATE TABLE my_table (
    ID NUMBER NOT NULL PRIMARY KEY,
    --... other columns ...
    t TIMESTAMP(0),
    PARTITION_KEY TIMESTAMP(0) GENERATED ALWAYS AS (COALESCE(t, TIMESTAMP '2999-01-01 00:00:00')) VIRTUAL
)
PARTITION BY RANGE (PARTITION_KEY) INTERVAL( NUMTODSINTERVAL(7, 'DAY')) ( 
    PARTITION PRE2018 VALUES LESS THAN (TIMESTAMP '2018-01-01 00:00:00')
);

解决它应该很简单PARTITION FOR (TIMESTAMP '2999-01-01 00:00:00')

也许您也可以GENERATED ALWAYS AS (COALESCE(t, TIMESTAMP '1900-01-01 00:00:00'))根据更适合您的逻辑使用。


推荐阅读