使用引用查询生成的临时表的外键创建一个表



我需要创建一个具有字段的表,该字段是引用另一个查询而不是现有表的外键。 例如,以下陈述是正确的:

CREATE TABLE T1 (ID1 varchar(255) references Types)

但是这个抛出了一个语法错误:

CREATE TABLE T2 (ID2 varchar(255) references SELECT ID FROM BaseTypes UNION SELECT ID FROM Types)

我不知道如何才能实现我的目标。如果需要引入临时表,如何在每次更改表BaseTypesTypes时强制更新此表?

我正在使用Firebird DB和IBExpert管理工具。

外键约束(references(只能引用表(或者更具体地说,表的主键或唯一键中的列(。不能使用它来引用选择。

如果要这样做,则需要使用CHECK约束,但该约束只会在插入和更新时检查:它不会阻止其他更改(例如,对所选表中的表(使约束无效数据处于静止状态。这意味着在插入时,该值可以满足约束,但约束可以 - 不被注意!- 无效。只有在更新行时,您才会注意到这一点。

CHECK约束的示例可以是:

CREATE TABLE T2 (
ID2 varchar(255) check (exists(
SELECT ID FROM BaseTypes WHERE BaseTypes.ID = ID2
UNION 
SELECT ID FROM Types WHERE Types.ID = ID2))
)

有关工作示例,请参阅此小提琴。

或者,如果您的目标是"合并"两个表,请定义一个包含两个表的主键的"超"表,并从外键约束引用该表。您可以使用触发器填充和更新(例如插入和删除(此表。或者,您可以使用单个表,并将现有视图替换为可更新的视图(如果可能的话,这取决于确切的数据,例如 ID 不应重叠(。

这更复杂,但会给你带来好处,即外键也是"静止"强制执行的。

最新更新