Commit complete.现在如果要删除包含2016年数据的ORDER_LINE_ITEMS分区,也可以删除对应2016年的ORDERS分区而不会违反引用完整性约束。尽管我们都很清楚这一点,但数据库并不知道: zx@ORCL>alter table order_line_items drop partition part_2016;
Table altered.
zx@ORCL>alter table orders drop partition part_2016; alter table orders drop partition part_2016 * ERROR at line 1: ORA-02266: unique/primary keys in table referenced by enabled foreign keys所以,对数据逆规范化的做活很笨拙,会耗费资源,而且可能破坏数据的完整性。不仅如此,它还会妨碍管理分区表时经常需要做的一项工作:清除老信息。下面来看引用分区。采用引用分区,子表会继承父表的分区机制,而不必对分区键逆规范化,而且更重要的是,它会让数据库了解这个子表与父表之间存在对等分区特点。也就是说,截除或删除生意人子表分区时,也能删除或截除父表分区。 要重新实现前面的例子,语法很简单,如下所示,这里将重用现胡的你表ORDERS,只需要截除这个表: zx@ORCL>drop table order_line_items cascade constraints;
Commit complete.创建一个新的子表: zx@ORCL>create table order_line_items 2 ( 3 order# number NOT NULL, 4 line# number NOT NULL, 5 data varchar2(30), 6 constraint c1_pk primary key(order#,line#), 7 constraint c1_fk_p foreign key(order#) references orders 8 ) 9 enable row movement 10 partition by reference(c1_fk_p) 11 /
Table created.
zx@ORCL>insert into order_line_items values 2 ( 1, 1, "yyy" );
1 row created.
zx@ORCL>insert into order_line_items values 2 ( 2, 1, "yyy" );
1 row created.
zx@ORCL>commit;
Commit complete.神奇之处就在CREATE TABLE语句的第10行。在这里,我们将区间分区语句替换为PARTITION BY REFERENCE。 这允许我们指定要使用的外键约束,从而发现分区机制。在这里可以看到外键指向ORDERS表——数据库读取ORDERS表的结构,并发现它有两个分区。因此,子表会有两个分区。实际上,如果现在查询数据字典可以得到: zx@ORCL>set linesize 200 zx@ORCL>col table for a20 zx@ORCL>col partition_name for a20 zx@ORCL>select table_name, partition_name 2 from user_tab_partitions 3 where table_name in ( "ORDERS", "ORDER_LINE_ITEMS" ) 4 order by table_name, partition_name 5 /
zx@ORCL>select table_name, partition_name 2 from user_tab_partitions 3 where table_name in ( "ORDERS", "ORDER_LINE_ITEMS" ) 4 order by table_name, partition_name 5 /
zx@ORCL>select table_name, partition_name 2 from user_tab_partitions 3 where table_name in ( "ORDERS", "ORDER_LINE_ITEMS" ) 4 order by table_name, partition_name 5 /