wol*_*lφi 3 sql oracle oracle11g
我们使用分区来删除旧数据(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.
Run Code Online (Sandbox Code Playgroud)
...这工作正常,但我们不能将分区日期保留为NULL:
INSERT INTO my_table(id, t) VALUES (2, NULL);
-- ORA-14300: partitioning key maps to a partition outside maximum permitted number of partitions
Run Code Online (Sandbox Code Playgroud)
如何解决这个问题?
例如,您可以这样做:
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')
);
Run Code Online (Sandbox Code Playgroud)
解决起来应该很简单PARTITION FOR (TIMESTAMP '2999-01-01 00:00:00')
GENERATED ALWAYS AS (COALESCE(t, TIMESTAMP '1900-01-01 00:00:00'))也许您也可以根据更适合您逻辑的方式来使用。
| 归档时间: |
|
| 查看次数: |
5947 次 |
| 最近记录: |