【问题标题】:MySQL: join fields with foreign key referencesMySQL:使用外键引用连接字段
【发布时间】:2015-08-19 09:24:42
【问题描述】:

我想做的事

我正在创建一个 html 表单,我想在其中自动创建字段(例如 <input type="text"><textarea><select>)。为此,我执行 MySQL 查询 "SHOW FIELDS from $table"

a) 现在我想将REFERENCED_TABLE_SCHEMAREFERENCED_TABLE_NAMEREFERENCED_COLUMN_NAMEinformation_schema.KEY_COLUMN_USAGE 加入到FIELDS 表中。

b) 稍后我想查询引用表中每个外键的可能值,以提供一个 html <select>-menu,用户可以在其中选择一个预设。

问题

到 a) 我如何在 MySQL 中加入这两个?

到 a) 和 b) 我正在使用 2 个数据对象(一个用于 FIELDS 和 References,另一个用于引用值)。您认为这是一个好方法还是有更好的方法?

编辑

说明

字段和引用的 JSON

[
    {
        "Field": "id",
        ...
        "Key": "PRI",
        ...
        "foreign_db": "null",
        "foreign_table": "null",
        "foreign_column": "null"
    },
    {
        "Field": "url",
        ...
        "Key": "UNI",
        ...
        "foreign_db": "null",
        "foreign_table": "null",
        "foreign_column": "null"
    },
    {
        "Field": "sitemap__site_id",
        ...
        "Key": "MUL",
        ...
        "foreign_db": "my_db",
        "foreign_table": "sitemap",
        "foreign_column": "site_id"
    }
]

参考列值的 JSON

[
    {
        "Field": "sitemap__site_id",
        "Value": "index" 
    },
    {
        "Field": "sitemap__site_id",
        "Value": "error" 
    },
    {
        "Field": "sitemap__site_id",
        "Value": "about" 
    }
]

放在一起,我可以自动创建一个 html <form>,其中每个字段都是根据其字段 Type 创建的(例如,文本 <input> 字段用于 varchar(32) 或 <textarea> 用于varchar(512) 和 <select> 字段,因为引用了外键,我必须预设可能的条目。

@rlanvin 希望这能说明问题。

再说一遍:我怎样才能让第一个 JSON 对象加入 MySQL 中?或者一般来说:这个问题通常是如何解决的?

【问题讨论】:

  • 我用 PHP 加入了
  • @Jens 到目前为止工作正常(使用 AJAX 动态),但它似乎不是最好的解决方案,因为我想让 MySQL 尽可能完成所有工作
  • 我不知道您的第二个问题是什么(“2 个数据对象?”),但对于第一个问题,您应该能够使用 table_schema 和 table_name 作为键加入 information_schema.columns。避免用于真正的项目,但我怀疑它是否有效。
  • 巨大的问题......如果没有大局,我无法说出我的方法会是什么,这超出了这个问题的范围。但是我可以制作两个 cmets:1)您的 JSON 结构过于冗长(例如,{"sitemap__site_id":["index", "error", "about"]} 会更容易使用)和 2)考虑在没有抽象的情况下暴露表的原始结构的风险(如果您想要一个非 FK 字段上的
  • 我应该说“风险和限制”。但是是的,“风险”就像“安全风险”一样。我不知道你的架构或你的项目,所以也许这不适用,但我看到至少有两个风险:1)如果你的 JSON 对客户端可见(用于 JS 或其他),他可以获得非常详细的信息了解数据库的确切结构。虽然不能直接利用,但它可能会促进/加剧其他利用,因此您不想公开展示它 2) 不小心使字段可见和可编辑,这可能会产生严重的安全影响。

标签: mysql join reference foreign-keys field


【解决方案1】:

到a)

SELECT
    c.COLUMN_NAME AS 'Field',
    c.COLUMN_KEY AS 'Key',
    k.REFERENCED_TABLE_SCHEMA AS 'foreign_db', 
    k.REFERENCED_TABLE_NAME AS 'foreign_table', 
    k.REFERENCED_COLUMN_NAME  AS 'foreign_column'
FROM
    information_schema.COLUMNS AS c
LEFT JOIN
    information_schema.KEY_COLUMN_USAGE AS k
ON 
    c.TABLE_SCHEMA = k.TABLE_SCHEMA
AND
    c.TABLE_NAME = k.TABLE_NAME
AND
    c.COLUMN_NAME = k.COLUMN_NAME
WHERE
    c.TABLE_SCHEMA = '$dbname'
AND
    c.TABLE_NAME = '$tableName'

【讨论】:

    猜你喜欢
    • 2016-02-19
    • 1970-01-01
    • 2023-03-20
    • 1970-01-01
    • 2021-12-27
    • 2016-02-21
    • 1970-01-01
    • 1970-01-01
    • 2013-01-25
    相关资源
    最近更新 更多