是否可以定义一个约束来推断一列(表 A,列 X)的值不能大于通过外键引用的另一列(表 B,列 Y)的值:
不,这需要在 CHECK 约束中使用 SELECT 语句,而 DB2 不支持。如果它确实支持以这种方式使用 SELECT 语句,它看起来像这样。
ALTER TABLE_B
ADD CONSTRAINT TABLE_B_Y_LT_L
CHECK (Y < (SELECT X FROM TABLE_A WHERE TABLE_A.ID = TABLE_B.A_ID));
SELECT 语句将返回单个值,因为 TABLE_A.ID 是唯一的。但是,就像我说的,DB2 不支持检查约束中的 SELECT 语句。我认为当前的任何 dbms 都没有。
解决方法
有几种解决方法。首先,您可以编写一个触发器。其次,您可以在两个表中存储列“X”,并使用外键约束和检查约束来实现您的要求。
-- Since "id" is unique, the combination of "id" and "x" is also unique.
-- Declaring "unique (id, x)" lets these two columns be the target of a
-- foreign key reference.
--
create table table_a (
id integer primary key,
x integer not null,
unique (id, x)
);
-- The foreign key references both columns in "table_a". The check constraint
-- indirectly guarantees that y < table_a.x.
--
create table table_b (
a_id integer not null,
a_x integer not null,
y integer not null,
primary key (a_id, a_x, y),
foreign key (a_id, a_x) references table_a (id, x),
check (y < a_x)
);
这是标准 SQL。它应该可以在任何当前的 SQL dbms 中工作。