有了Postgresql,至少你可以用table inheritance來做到這一點。
您可以爲包含所需約束的特定客戶端定義一個繼承表。
考慮下面的例子:
psql=> CREATE TABLE a(client INT NOT NULL, id SERIAL, foo TEXT);
CREATE TABLE
psql=> CREATE TABLE b(foo TEXT NOT NULL, CHECK (CLIENT=1)) INHERITS (a);
NOTICE: moving and merging column "foo" with inherited definition
DETAIL: User-specified column moved to the position of the inherited column.
CREATE TABLE
psql=> INSERT INTO b(client,foo) VALUES (1,'a');
INSERT 0 1
psql=> INSERT INTO b(client,foo) VALUES (1,NULL);
ERROR: null value in column "foo" violates not-null constraint
DETAIL: Failing row contains (1, 2, null).
表「B」在這種情況下,從「A」,但沒有列「富」包括一個非空約束了不同的定義繼承。另請注意,我使用了檢查約束來確保只有客戶端1的記錄可以進入此表。
要做到這一點,要麼必須更新應用程序才能將客戶端記錄插入到正確的表中,要麼需要編寫一個自動執行該操作的觸發器。如何做到這一點的例子在partitioning的手冊部分給出。
您的應用程序仍然可以對父表(我的示例中的'a')進行查詢並獲取所有客戶端的記錄,包括子表中的任何客戶端。
如果用戶正在使用函數寫入數據庫,您可以簡單地編寫子函數來檢查數據是否輸入'IS NULL' –
您需要爲三個不同的數據庫編寫代碼? –
@GordonLinoff我們有一些客戶使用SQL Server,有些使用Oracle。我需要postgresql,以防我們得到一個postgresql的客戶。我們只支持這3個數據庫。 – Luke101