oracle分割槽及分割槽索引partition_partition index_維護(四)

wisdomone1發表於2012-12-29
前幾篇主要測試了範圍分割槽的建立及維護,側重語法方面;
   參見:
http://space.itpub.net/9240380/viewspace-751843
如:建立分割槽表,新增分割槽表,刪除分割槽,修改分割槽屬性,合併分割槽,拆分分割槽,交換分割槽等
如下開始學習分割槽表與主鍵約束相關知識
 
--------------查詢分割槽表的主鍵約束,續前是建立普通的主鍵約束,此約束對應的索引也是普通索引,未進行分割槽
SQL> select constraint_name from user_constraints where table_name='T_TEST_PARTI
TION_1';
CONSTRAINT_NAME
------------------------------
PK_T_TEST_PARTITION_1
--刪除主鍵約束
SQL> alter table t_test_partition_1 drop primary key;
表已更改。
--確認是否刪除主鍵約束
SQL> select constraint_name from user_constraints where table_name='T_TEST_PARTI
TION_1';
未選定行
 
-----------查詢分割槽表的分割槽數量
SQL> select table_name,partition_name from user_tab_partitions where table_name=
'T_TEST_PARTITION_1';
TABLE_NAME                     PARTITION_NAME
------------------------------ ------------------------------
T_TEST_PARTITION_1             P1_OLD
T_TEST_PARTITION_1             P2
T_TEST_PARTITION_1             P3
T_TEST_PARTITION_1             P4
T_TEST_PARTITION_1             P5

--查詢分割槽表的表結構
SQL> desc t_test_partition_1;
 名稱                                      是否為空? 型別
 ----------------------------------------- -------- ----------------------------
 ID                                                 NUMBER(38)
 REQTIME                                            TIMESTAMP(6)
 CALL_IP                                            VARCHAR2(200)

---修改分割槽表的列id屬性不空為
SQL> alter table t_test_partition_1 modify id not null;
表已更改。
SQL> desc t_test_partition_1;
 名稱                                      是否為空? 型別
 ----------------------------------------- -------- ----------------------------
 ID                                        NOT NULL NUMBER(38)
 REQTIME                                            TIMESTAMP(6)
 CALL_IP                                            VARCHAR2(200)
 
 
 ------說明在分割槽表情況下,如要構建主鍵約束,須包含分割槽鍵列,不然會報錯
 SQL> create unique index pk_t_test_partition_1_id on t_test_partition_1(id)
  2  local
  3  (partition p1,
  4   partition p2,
  5   partition p3,
  6   partition p4,
  7   partition p5);
create unique index pk_t_test_partition_1_id on t_test_partition_1(id)
                                                *
第 1 行出現錯誤:
ORA-14039: 分割槽列必須構成 UNIQUE 索引的關鍵字列子集
---包括分割槽鍵再次建立成功
SQL> create unique index pk_t_test_partition_1_id on t_test_partition_1(reqtime,
id)
  2  local
  3  (partition p1,
  4   partition p2,
  5   partition p3,
  6   partition p4,
  7   partition p5)
  8  /
索引已建立。

--------基於分割槽鍵的本地分割槽索引數量為5,基於分割槽鍵和主鍵ID的本地唯一分割槽索引為5
  1* select index_name,partition_name,status from user_ind_partitions where inde
x_name in(select index_name from user_indexes where table_name='T_TEST_PARTITION
_1')order by index_name
SQL> /
INDEX_NAME                     PARTITION_NAME                 STATUS
------------------------------ ------------------------------ --------
IDX_T_TEST_PARTITION_1_ID      P2_IDX2                        USABLE
IDX_T_TEST_PARTITION_1_ID      P1_OLD                         USABLE
IDX_T_TEST_PARTITION_1_ID      P5_IDX5                        USABLE
IDX_T_TEST_PARTITION_1_ID      P4_IDX4                        USABLE
IDX_T_TEST_PARTITION_1_ID      P3_IDX3                        USABLE
PK_T_TEST_PARTITION_1_ID       P2                             USABLE
PK_T_TEST_PARTITION_1_ID       P1                             USABLE
PK_T_TEST_PARTITION_1_ID       P5                             USABLE
PK_T_TEST_PARTITION_1_ID       P4                             USABLE
PK_T_TEST_PARTITION_1_ID       P3                             USABLE
已選擇10行。

---如下掃錯原因:2013-01-16 00:00:0000000應與格式對應,即為:2013-01-16 00:00:00.00000
insert into t_test_partition_1 values(3,to_timestamp('2013-01-16 00:00:0000000',
'yyyy-mm-dd hh24:mi:ss.ff'),'2,2,3,3')
                                                     *
第 1 行出現錯誤:
ORA-01830: 日期格式圖片在轉換整個輸入字串之前結束
---------調整後再次插入成功
  1* insert into t_test_partition_1 values(3,to_timestamp('2013-01-16 00:00:00.0
0000','yyyy-mm-dd hh24:mi:ss.ff'),'2,2,3,3')
SQL> /
已建立 1 行。

------重複插入違反唯一約束
SQL> /
insert into t_test_partition_1 values(3,to_timestamp('2013-01-16 00:00:00.00000'
,'yyyy-mm-dd hh24:mi:ss.ff'),'2,2,3,3')
*
第 1 行出現錯誤:
ORA-00001: 違反唯一約束條件 (SCOTT.PK_T_TEST_PARTITION_1_ID)

---插入一個新的id,即可插入成功
SQL> insert into t_test_partition_1 values(4,to_timestamp('2013-01-16 00:00:00.0
0000','yyyy-mm-dd hh24:mi:ss.ff'),'2,2,4,3');
已建立 1 行。
-----------id相同,但call_ip不同,同樣不能插入報違反主鍵約束
SQL> insert into t_test_partition_1 values(4,to_timestamp('2013-01-16 00:00:00.0
0000','yyyy-mm-dd hh24:mi:ss.ff'),'2,2,3,3');
insert into t_test_partition_1 values(4,to_timestamp('2013-01-16 00:00:00.00000'
,'yyyy-mm-dd hh24:mi:ss.ff'),'2,2,3,3')
*
第 1 行出現錯誤:
ORA-00001: 違反唯一約束條件 (SCOTT.PK_T_TEST_PARTITION_1_ID)

SQL> desc user_cons_columns;
 名稱                                      是否為空? 型別
 ----------------------------------------- -------- ----------------------------
 OWNER                                     NOT NULL VARCHAR2(30)
 CONSTRAINT_NAME                           NOT NULL VARCHAR2(30)
 TABLE_NAME                                NOT NULL VARCHAR2(30)
 COLUMN_NAME                                        VARCHAR2(4000)
 POSITION                                           NUMBER

---查主鍵約束的構建列情況
SQL> select constraint_name,table_name,column_name from user_cons_columns where
table_name='T_TEST_PARTITION_1';
CONSTRAINT_NAME                TABLE_NAME
------------------------------ ------------------------------
COLUMN_NAME
--------------------------------------------------------------------------------
SYS_C0027153                   T_TEST_PARTITION_1
ID

--查詢分割槽表的索引情況
SQL> select index_name from user_indexes where table_name='T_TEST_PARTITION_1';
INDEX_NAME
------------------------------
IDX_T_TEST_PARTITION_1_ID
PK_T_TEST_PARTITION_1_ID

小結:1,對於分割槽表,構建主鍵約束,建立語法不同於普通表,而要新增分割槽鍵,
     2,本文簡述分割槽表和主鍵的一些小知識,後續依次展開其它分割槽型別的學習及測試

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/9240380/viewspace-751854/,如需轉載,請註明出處,否則將追究法律責任。

相關文章