根据Oracle官方文档介绍,引用分区表是通过PARTITION BY REFERENCE语句来实现,需要指定引用约束的名称,该约束将成为应用到该引用分区表所使用的约束。这个约束必须启用和执行。
和其他分区表一样,你可以制定对象级别的默认属性,也可以随意在特定分区设置属性,覆盖对象级别的属性。
下面的sql语句创建了一个范围分区表orders,引用分区子表order_items包含了4个分区,分别是Q1_2005, Q2_2005, Q3_2005, Q4_2005,每个分区包含的order_items数据都是根据父表关联列的范围分区来存储。
点击(此处)折叠或打开
-
CREATE TABLE orders
-
( order_id NUMBER(12),
-
order_date TIMESTAMP,
-
order_mode VARCHAR2(8),
-
customer_id NUMBER(6),
-
order_status NUMBER(2),
-
order_total NUMBER(8,2),
-
sales_rep_id NUMBER(6),
-
promotion_id NUMBER(6),
-
CONSTRAINT orders_pk PRIMARY KEY(order_id)
-
)
-
PARTITION BY RANGE(order_date)
-
( PARTITION Q1_2005 VALUES LESS THAN (TO_DATE('01-APR-2005','DD-MON-YYYY')),
-
PARTITION Q2_2005 VALUES LESS THAN (TO_DATE('01-JUL-2005','DD-MON-YYYY')),
-
PARTITION Q3_2005 VALUES LESS THAN (TO_DATE('01-OCT-2005','DD-MON-YYYY')),
-
PARTITION Q4_2005 VALUES LESS THAN (TO_DATE('01-JAN-2006','DD-MON-YYYY'))
-
);
-
-
CREATE TABLE order_items
-
( order_id NUMBER(12) NOT NULL,
-
line_item_id NUMBER(3) NOT NULL,
-
product_id NUMBER(6) NOT NULL,
-
unit_price NUMBER(8,2),
-
quantity NUMBER(8),
-
CONSTRAINT order_items_fk
-
FOREIGN KEY(order_id) REFERENCES orders(order_id)
-
)
- PARTITION BY REFERENCE(order_items_fk);
需要注意的是,在引用分区表中不能指定分区的边界。
引用分区表的分区可以单独命名,如果没有显式地制定分区名称,则直接继承其关联的父表分区名称,除非父表分区名称和已有名称冲突。这种情况下,系统将自动生成一个分区名称。由于上述sql语句没有指定名称,则子表分区和父表分区的名称应该相同。
点击(此处)折叠或打开
-
SQL> select table_name,partition_name from user_tab_partitions;
-
-
TABLE_NAME PARTITION_NAME
-
------------------------------ ------------------------------
-
ORDER_ITEMS Q4_2005
-
ORDER_ITEMS Q3_2005
-
ORDER_ITEMS Q2_2005
-
ORDER_ITEMS Q1_2005
-
ORDERS Q4_2005
-
ORDERS Q3_2005
-
ORDERS Q2_2005
-
ORDERS Q1_2005
-
-
8 rows selected.
-
- SQL>
如果sql语句没有显式指定表空间,则引用分区表的分区将和父表的相关分区放在一起。