代码之家  ›  专栏  ›  技术社区  ›  Razzupaltuff

使用PHP从另一个表中确定外键引用的表的名称?

  •  1
  • Razzupaltuff  · 技术社区  · 5 年前

    只是学习mysql和php,并且必须为我的考试创建一个测试项目。

    如何从另一个表(源)引用中确定表(目标)的名称(外键),以及如何使用PHP来实现这一点?

    我已经在谷歌上搜索了几个小时,也浏览了SO,但还没有找到一个有效的解决方案。

    编辑:我明白我需要更精确。我想查看表a中的外键列定义,并找出它引用了数据库中的另一个表,而不知道被引用表的名称。我还希望这在表A为空时起作用。因此,我想我需要以某种方式访问表A的定义/描述(scheme?),查看有问题的外键列存储的内容,并以此方式确定目标表。

    实例

    我有一张“产品”(来源)表和一张“制造商”(目标)表。

    “products”有一个列“manufacturer”,这是一个引用“manufactures”的外键。

    现在,我想创建一些php代码,查看表“products”的“manufacturers”列,并发现存储在该列中的外键将引用表“manufactures”。所有这些都不需要php事先知道引用的表。如果表“products”为空,即不包含任何外键值,则这也应该有效。

    因此,任何已经要求我输入被引用表名称的SQL查询对我来说都毫无意义。

    我试过了

    CREATE TABLE manufacturers (
        id INTEGER PRIMARY KEY,
        name VARCHAR(100)
        );
    
    CREATE TABLE products (
        id INTEGER PRIMARY KEY,
        name VARCHAR(100),
        manufacturer INTEGER
        );
    
    ALTER TABLE products ADD FOREIGN KEY(manufacturer) REFERENCES manufacturers(id);
    
    SELECT TABLE_NAME,
           COLUMN_NAME,
           REFERENCED_TABLE_NAME
    FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE
    WHERE TABLE_SCHEMA = DATABASE()
      AND TABLE_NAME = "products"
      AND REFERENCED_TABLE_NAME IS NOT NULL;
    

    但结果是空的。

    编辑2:

    我发现INFORMATION_SCHEMA。KEY_COLUMN_USAGE在我的整个sql安装中不存在。或者至少我哪儿也看不到。

    编辑3:

    我发现了我的错误。我必须指定实际的数据库名称,而不是“DATABASE()”。

    谢谢你的帮助。:)

    1 回复  |  直到 5 年前
        1
  •  2
  •   Akina    5 年前
    SELECT CONSTRAINT_SCHEMA,
           CONSTRAINT_NAME,
           TABLE_SCHEMA,
           TABLE_NAME,
           COLUMN_NAME,
           REFERENCED_TABLE_SCHEMA,
           REFERENCED_TABLE_NAME,
           REFERENCED_COLUMN_NAME
    FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE
    WHERE TABLE_SCHEMA = slave_database
      AND TABLE_NAME = slave_table
      AND REFERENCED_TABLE_NAME IS NOT NULL;
    

    The INFORMATION_SCHEMA KEY_COLUMN_USAGE Table


    我想查看表a中的一个外键,并在不知道该表名称的情况下找出它引用了数据库中的另一个表。

    什么问题?完全相同:

    SELECT CONSTRAINT_SCHEMA,
           CONSTRAINT_NAME,
           TABLE_SCHEMA,
           TABLE_NAME,
           COLUMN_NAME,
           REFERENCED_TABLE_SCHEMA,
           REFERENCED_TABLE_NAME,
           REFERENCED_COLUMN_NAME
    FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE
    WHERE REFERENCED_TABLE_SCHEMA = main_database
      AND REFERENCED_TABLE_NAME = main_table;
    
    推荐文章