1
我有一個主,父表'transaction_',我想分區。我知道我可以根據transaction_中列出的任何字段(包括外鍵)輕鬆進行分區,在任何子表內使用檢查約束。基本上我想知道的是,在我的檢查約束中,我是否可以以某種方式引用表中有外鍵的其他字段。我想避免在我的transaction_表中有很多來自賣方和客戶表的外鍵,因爲這似乎是很多不必要的重複。如何交叉引用其他表中的數據以進行分區檢查?
CREATE SEQUENCE transaction_id_seq;
CREATE TABLE transaction_ (
transaction_id bigint PRIMARY KEY DEFAULT nextval('transaction_id_seq'),
seller_id int REFERENCES seller(id),
client_id int REFERENCES client(id),
purchase_date date,
purchase_time time,
price real,
quantity int
);
CREATE TABLE seller (
id int PRIMARY KEY,
name text,
location text,
open_time time,
close_time time
);
CREATE TABLE client (
id int PRIMARY KEY,
name text,
billing_suburb text,
billing_zipcode int
);
因此,舉例來說,我認爲我可以做到以下幾點:
CREATE TABLE transaction_client1_20130108 (
CHECK (client_id = 1 AND purchase_date = DATE '2013-01-08')
) INHERITS (transaction_);
我想這樣做如下:
CREATE TABLE transaction_sellerZip90210_20130108 (
CHECK (client(billing_zipcode) = 90210 AND purchase_date = DATE '2013-01-08')
) INHERITS (transaction_);
使用以下,但開心更新如果提供更好的解決方案:
mydb=#SELECT version();
PostgreSQL 9.1.11 on x86_64-unknown-linux-gnu, compiled by gcc (Ubuntu/Linaro 4.8.1-10ubuntu9) 4.8.1, 64-bit
感謝您的答覆@craig。說得通。我假設一個觸發器(比如說BEFORE INSERT ON transaction_)將在我對錶分區施加的任何CHECK約束之前執行。它是否正確? – aerospatiale
@JoshuaLawes更正'BEFORE'觸發器,是的。 –