有了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