sql—创建一个表,其中外键引用查询生成的临时表

z9gpfhce  于 2021-07-26  发布在  Java
关注(0)|答案(1)|浏览(522)

我需要创建一个包含字段的表,该字段是引用另一个查询而不是现有表的外键。e、 g.以下陈述是正确的: CREATE TABLE T1 (ID1 varchar(255) references Types) 但是这一个抛出了一个语法错误: CREATE TABLE T2 (ID2 varchar(255) references SELECT ID FROM BaseTypes UNION SELECT ID FROM Types) 我不知道怎样才能达到我的目标。在需要引入临时表的情况下,如何强制每次更新表时都更新此表 BaseTypes 以及 Types 是否已更改?
我正在使用firebirddb和ibexpert管理工具。

pxy2qtax

pxy2qtax1#

外键约束( references )只能引用一个表(或者更确切地说是表的主键或唯一键中的列)。您不能使用它来引用选择。
如果你想这样做,你需要使用 CHECK 约束,但该约束仅在插入和更新时被检查:它不会阻止其他更改(例如对select中的表的更改)在数据静止时使约束无效。这意味着在插入时,该值可以满足约束,但约束可能-未被注意到!-无效。只有在更新行时才会注意到这一点。
一个例子 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不应重叠)。
这更复杂,但会给您一个好处,即外键也是在“静止”时强制执行的。

相关问题