【问题标题】:How to get InnoDB table names that are linked to foreign key value?如何获取链接到外键值的 InnoDB 表名?
【发布时间】:2019-06-20 22:38:44
【问题描述】:

我有多个表(例如:具有外键 ADDRESS_ID 的 A、B、C....等)链接到“地址”表,其中 ADDRESS_ID 是主键。表 A、B、C... 可能有或没有 address_ID 值。是否有一个查询我可以在地址表中获取具有给定 ADDRESS_ID 的表名?请注意,这不是“地址”表中给定列的表名。我需要地址表中给定 Address_ID 值 的表名,如果它已在其他表中引用。 (我不知道所有可能引用了 address_id 的表。)

Address table 
ADDRESS_ID (PK) |   STREET ADDRESS_1   |   STREET_ADDRESS_2  |   CITY  |  ZIPCODE    


Table A
A_ID  |  ADDRESS_ID (FK) |  FIELD _1  |   FIELD_2

Table B
B_ID  |  ADDRESS_ID (FK)|  FIELD _!  |  FIELD_2

Table C
B_ID  |  ADDRESS_ID (FK) |  FIELD _! |  FIELD_2

更多表格......

这是我尝试过的:

SELECT * FROM information_schema.TABLE_CONSTRAINTS 
WHERE 
information_schema.TABLE_CONSTRAINTS.CONSTRAINT_TYPE = 'FOREIGN KEY' AND
TABLE_CONSTRAINTS.TABLE_SCHEMA = 'flower_db' AND
TABLE_CONSTRAINTS.TABLE_NAME = 'address';

但这不支持我真正想要的。

【问题讨论】:

标签: mysql innodb


【解决方案1】:
SELECT *
    FROM information_schema.REFERENTIAL_CONSTRAINTS
    WHERE REFERENCED_TABLE_NAME = 'address'

(根据需要调整查询)

【讨论】:

    【解决方案2】:
     SELECT 'TableA' as Table_Has_Address       
     FROM TableA
     GROUP BY ADDRESS_ID
     HAVING COUNT(CASE WHEN ADDRESS_ID = @address_id THEN 1 END) > 0
    
     UNION ALL
    
     SELECT 'TableB' as Table_Has_Address       
     FROM TableB
     GROUP BY ADDRESS_ID
     HAVING COUNT(CASE WHEN ADDRESS_ID = @address_id THEN 1 END) > 0
    
     UNION ALL
    
     SELECT 'TableC' as Table_Has_Address       
     FROM TableC
     GROUP BY ADDRESS_ID
     HAVING COUNT(CASE WHEN ADDRESS_ID = @address_id THEN 1 END) > 0
    

    【讨论】:

    • 是的,我知道这种方法,但正如我所说,我不知道地址表中有多少个引用 ADDRESS_ID 的表。在这种情况下,如果我必须为每个表编写此方法,则此方法不起作用且效率极低。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-15
    相关资源
    最近更新 更多