代码之家  ›  专栏  ›  技术社区  ›  wolφi

如何在Oracle的间隔分区表中存储空值?

  •  1
  • wolφi  · 技术社区  · 7 年前

    我们使用分区来删除旧数据(Oracle称之为 ILM ). 有一列显示“best before date”,之后将删除分区。

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

    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
    

    如何解决这个问题?

    1 回复  |  直到 7 年前
        1
  •  4
  •   Wernfried Domscheit    7 年前

    你可以这样做,例如:

    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')) 取决于什么更符合你的逻辑。

    推荐文章