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 

回答

0

是否在我的檢查約束,我可以以某種方式參考其他領域在,我有一個外鍵

不直接表。 CHECK約束可能不包含子查詢。但是,您可以通過聲明一個LANGUAGE SQL函數來執行所需的工作,並使用中的約束來解決該問題。

雖然這並不安全。查詢規劃人員預計約束條件將準確和真實,並可能基於此約束做出優化決策。因此,通過在另一個表上添加迂迴約束來欺騙系統並不是一個好主意。

相反,我建議使用觸發器進行理智檢查,在執行任何DML時運行檢查。

+0

感謝您的答覆@craig。說得通。我假設一個觸發器(比如說BEFORE INSERT ON transaction_)將在我對錶分區施加的任何CHECK約束之前執行。它是否正確? – aerospatiale

+0

@JoshuaLawes更正'BEFORE'觸發器,是的。 –