gpt4 book ai didi

oracle - 从范围分区到范围间隔

转载 作者:行者123 更新时间:2023-12-05 00:28:33 27 4
gpt4 key购买 nike

我想从范围分区移动到范围间隔,但我当前的表在 MAXVALUE 上有一个分区用于分区的列允许空值:(

例如:假设我们有:

create table a (b number)
partition by range (b) (
PARTITION p0 VALUES LESS THAN (10),
PARTITION p1 VALUES LESS THAN (50),
PARTITION p2 VALUES LESS THAN (MAXVALUE)
);

然后我们填充:
INSERT INTO a(b) VALUES (1);
INSERT INTO a(b) VALUES (11);
INSERT INTO a(b) VALUES (51);
INSERT INTO a(b) VALUES (null);

为了能够移动到区间,我们需要使用 MAXVALUE 删除分区。 ,因此,其他值应移至新分区。
51 不是问题,我会用 VALUES LESS than 100 创建分区,但是 NULL 呢?那些?

我正在考虑更改为按范围分区之类的东西 (NVL(b,0)) ,但我害怕必须重新处理整个表(不可能,真实表有很多数据)。

任何的想法?

最佳答案

You can't have NULL in the partition key column of an interval partitioned table (截至 12.1):

Restrictions on Interval Partitioning

  • You can specify only one partitioning key column, and it must be of NUMBER, DATE, FLOAT, or TIMESTAMP data type.

[...]

  • You cannot specify NULL values for the partitioning key column.


您也不能对分区键使用表达式。然而正如 @Shoelace 所建议的您可以使用虚拟列(包含您的表达式)作为分区列:
SQL> CREATE TABLE a (b NUMBER, comput_b NUMBER AS (NVL(b, 0)))
2 PARTITION BY RANGE (comput_b) (
3 PARTITION p0 VALUES LESS THAN (0),
4 PARTITION p1 VALUES LESS THAN (50),
5 PARTITION p2 VALUES LESS THAN (MAXVALUE)
6 );

Table created

SQL> INSERT INTO a(b) VALUES (1);
1 row inserted
SQL> INSERT INTO a(b) VALUES (11);
1 row inserted
SQL> INSERT INTO a(b) VALUES (51);
1 row inserted
SQL> INSERT INTO a(b) VALUES (null);
1 row inserted

SQL> SELECT * FROM a;

B COMPUT_B
---------- ----------
1 1
11 11
0
51 51

在这种特殊情况下,我认为您需要重建表。

关于oracle - 从范围分区到范围间隔,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18844189/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com