我需要将外键存储在不直接引用表的表中。我解释。在这里,我想做类似于继承的事情,但实际上并非如此。对于我的表中的给定记录,我有两个重要的字段:任意或泛型键,以及表示此类键所引用类型的字段。这个想法是存储一个整数,然后关于密钥的类型,加入相应的表。
甚至可能吗?有哪些替代方案?我不想继承 - 我没有使用 ODBMS 。
答案 0 :(得分:0)
“子”表中的外键必须引用单个“父”表。必须在定义密钥时指定父级。子表中的所有行都必须引用相同的父表 - 不能逐行区分。
但请注意,为了在连接中使用,列不需要是外键。外键约束将阻止将不正确的键插入子表,并通过级联到子表或抛出错误来处理父表中的删除。如果您不关心此功能,可以正常存储“外键”列,并在外连接中使用它,如下所示:
select *
from child c
left outer join referenced1 r1 on c.fk = r1.pk AND c.code = 'first'
left outer join referenced2 r2 on c.fk = r2.pk AND c.code = 'second'
left outer join referenced3 r3 on c.fk = r3.pk AND c.code = 'third'
上面的示例假定您的“外键”包含两列 - fk
表示您引用的行,code
表示您想要的表。
答案 1 :(得分:0)
Multi-table foreign key
(或者更具体地说,“类似于外键”)。除非您关心数据完整性,否则它会以某种方式工作。事实上,有些人认为这是SQL反模式之一。 : - )
当然,您可以创建一些触发器过程,并在每次“相关”表中是否存在新值/修改值时进行检查。但它并不优雅。
我认为更好的方法是在“相关”表中创建外键(每种类型一个表):
main_table:
id
...(other columns)
table_type_first:
main_table_id
foreign_key_for_type_1
...(other columns)
table_type_second:
main_table_id
foreign_key_for_type_2
...(other columns)
它也不是很棒,也许它不是你需要的(你没有类型列,“实体”类型依赖于“类型”表中记录的存在),但它提供了更多的数据完整性。 / p>