PolarDB PostgreSQL版(兼容Oracle)支持分區表使用任意列作為主鍵或者外鍵引用。
前提條件
PolarDB PostgreSQL版(兼容Oracle)的內核小版本需為20230930(v1.1.35)版本及以上。
注意事項
指定主鍵時,如果包含所有分區鍵,則默認使用Local Index作為主鍵,否則使用Global Index作為主鍵。
指定約束時,如果包含所有分區鍵,則默認使用Local Index作為唯一約束,否則使用Global Index作為唯一約束。
alter table xxx add primary key using index xxx
語句中只能使用Global Index,不能使用Local Index,因為Local index不一定能滿足約束,alter table增加唯一約束也是如此。外鍵引用的表如果發生跨分區更新,可能會報錯阻止,因為跨分區更新本質上是一次刪除和一次插入,在執行刪除時會檢測此行是否被外鍵引用。
示例
為分區表指定主鍵
CREATE TABLE sale
(
dept_no number primary key,
part_no varchar2,
country varchar2(20),
date date,
amount number unique
)
PARTITION BY RANGE(date)
SUBPARTITION BY LIST(country)
(
PARTITION q1_2012
VALUES LESS THAN('2012-Apr-01')
(
SUBPARTITION q1_europe VALUES ('FRANCE', 'ITALY'),
SUBPARTITION q1_asia VALUES ('INDIA', 'PAKISTAN'),
SUBPARTITION q1_americas VALUES ('US', 'CANADA')
),
PARTITION q2_2012
VALUES LESS THAN('2012-Jul-01')
(
SUBPARTITION q2_europe VALUES ('FRANCE', 'ITALY'),
SUBPARTITION q2_asia VALUES ('INDIA', 'PAKISTAN'),
SUBPARTITION q2_americas VALUES ('US', 'CANADA')
),
PARTITION q3_2012
VALUES LESS THAN('2012-Oct-01')
(
SUBPARTITION q3_europe VALUES ('FRANCE', 'ITALY'),
SUBPARTITION q3_asia VALUES ('INDIA', 'PAKISTAN'),
SUBPARTITION q3_americas VALUES ('US', 'CANADA')
),
PARTITION q4_2012
VALUES LESS THAN('2013-Jan-01')
(
SUBPARTITION q4_europe VALUES ('FRANCE', 'ITALY'),
SUBPARTITION q4_asia VALUES ('INDIA', 'PAKISTAN'),
SUBPARTITION q4_americas VALUES ('US', 'CANADA')
)
);
\d sales
數據表 "public.sales"
欄位 | 類型 | 校對規則 | 可空的 | 預設
---------+-----------------------+----------+----------+------
dept_no | numeric | | not null |
part_no | character varying | | |
country | character varying(20) | | |
date | date | | |
amount | numeric | | |
分區鍵值: RANGE (date) NULLS LAST
索引:
"sales_pkey" PRIMARY KEY, btree (dept_no) GLOBAL
分區的數量:4(可以使用 \d+ 來列出它們)
引用分區表的唯一約束為外鍵
CREATE TABLE shipments
( order_id NUMBER NOT NULL
, order_date DATE NOT NULL
, delivery_date DATE NOT NULL
, customer_id NUMBER NOT NULL
, sales_amount NUMBER NOT NULL REFERENCES sales(amount)
, PRIMARY KEY (order_date, order_id, delivery_date)
)
PARTITION BY RANGE (order_date)
(
PARTITION p_2006_aug VALUES LESS THAN (TO_DATE('01-SEP-2006','dd-MON-yyyy'))
, PARTITION p_2006_sep VALUES LESS THAN (TO_DATE('01-OCT-2006','dd-MON-yyyy'))
, PARTITION p_2006_oct VALUES LESS THAN (TO_DATE('01-NOV-2006','dd-MON-yyyy'))
, PARTITION p_2006_nov VALUES LESS THAN (TO_DATE('01-DEC-2006','dd-MON-yyyy'))
, PARTITION p_2006_dec VALUES LESS THAN (TO_DATE('01-JAN-2007','dd-MON-yyyy'))
);
\d shipments
數據表 "public.shipments"
欄位 | 類型 | 校對規則 | 可空的 | 預設
---------------+---------+----------+----------+------
order_id | numeric | | not null |
order_date | date | | not null |
delivery_date | date | | not null |
customer_id | numeric | | not null |
sales_amount | numeric | | not null |
分區鍵值: RANGE (order_date) NULLS LAST
索引:
"shipments_pkey" PRIMARY KEY, btree (order_date, order_id, delivery_date)
外部鍵(FK)限制:
"shipments_sales_amount_fkey" FOREIGN KEY (sales_amount) REFERENCES sales(amount)
"shipments_sales_amount_fkey1" FOREIGN KEY (sales_amount) REFERENCES sales_q1_2012(amount)
"shipments_sales_amount_fkey10" FOREIGN KEY (sales_amount) REFERENCES sales_q3_americas(amount)
"shipments_sales_amount_fkey11" FOREIGN KEY (sales_amount) REFERENCES sales_q3_europe(amount)
"shipments_sales_amount_fkey12" FOREIGN KEY (sales_amount) REFERENCES sales_q3_asia(amount)
"shipments_sales_amount_fkey13" FOREIGN KEY (sales_amount) REFERENCES sales_q4_2012(amount)
"shipments_sales_amount_fkey14" FOREIGN KEY (sales_amount) REFERENCES sales_q4_americas(amount)
"shipments_sales_amount_fkey15" FOREIGN KEY (sales_amount) REFERENCES sales_q4_europe(amount)
"shipments_sales_amount_fkey16" FOREIGN KEY (sales_amount) REFERENCES sales_q4_asia(amount)
"shipments_sales_amount_fkey2" FOREIGN KEY (sales_amount) REFERENCES sales_q1_americas(amount)
"shipments_sales_amount_fkey3" FOREIGN KEY (sales_amount) REFERENCES sales_q1_europe(amount)
"shipments_sales_amount_fkey4" FOREIGN KEY (sales_amount) REFERENCES sales_q1_asia(amount)
"shipments_sales_amount_fkey5" FOREIGN KEY (sales_amount) REFERENCES sales_q2_2012(amount)
"shipments_sales_amount_fkey6" FOREIGN KEY (sales_amount) REFERENCES sales_q2_americas(amount)
"shipments_sales_amount_fkey7" FOREIGN KEY (sales_amount) REFERENCES sales_q2_europe(amount)
"shipments_sales_amount_fkey8" FOREIGN KEY (sales_amount) REFERENCES sales_q2_asia(amount)
"shipments_sales_amount_fkey9" FOREIGN KEY (sales_amount) REFERENCES sales_q3_2012(amount)
分區的數量:5(可以使用 \d+ 來列出它們)
文檔內容是否對您有幫助?