所以我有一个地址表,在各种其他表之间共享,例如学校,公园,教堂等。学校,公园等都是地址中一行的外键。
我想知道的是,如果我在地址表中有一个特定的行,是否有办法找出哪个表指向哪一行。基本上就是这样:
SELECT * FROM schools WHERE address_id = 1
但这意味着我必须知道第1行的地址与学校相关联。但是,如果我不知道呢?它可能是其他10个表中的一个......
答案 0 :(得分:5)
您将不得不查询其他每个表。
我会将其作为UNION查询:
SELECT id, "schools" as whichTable from schools where address_id=1
UNION
SELECT id, "parks" as whichTable from parks where address_id=1
UNION
...
这样您只需运行一个查询并将结果作为您使用的单个数据集取回。
如果您有表格列表(或表格表格),您可以以编程方式生成查询 - 这样可以避免在更改表格时更新查询。
答案 1 :(得分:2)
您正在寻找的 - 假设您拥有符合ISO标准的RDBMS - 是INFORMATION_SCHEMA表集(实际上是视图集,但是嘿)。
你可以找到这样的依赖表:
select
cons.CONSTRAINT_NAME 'ConstraintName',
keys.TABLE_NAME 'PKTable',
keys.COLUMN_NAME 'PKColumn',
cols.TABLE_NAME 'FKTable',
cols.COLUMN_NAME 'FKColumn'
from INFORMATION_SCHEMA.REFERENTI cons
join INFORMATION_SCHEMA.CONSTRAINT_COLUMN_USAGE cols on cols.CONSTRAINT_NAME = cons.CONSTRAINT_NAME
join INFORMATION_SCHEMA.KEY_COLUMN_USAGE keys on keys.CONSTRAINT_NAME = cons.UNIQUE_CONSTRAINT_NAME
注意:这是一个非常粗略,未经测试的查询。但是你明白了。