我正在创建一个类,它从数据库中获取一个表,并将其显示到一个网页,尽可能多地提供功能。我想支持的一件事就是让类检测表中的哪些列对它们有外键约束,以便它可以转到那些表,获取它们的所有值并在select中使用它们编辑这些字段时调用的-box,以避免某人违反外键约束,
主要问题是发现哪些字段对它们有外键约束,以及它们指向哪些表。有谁知道怎么做???
谢谢,
Lemiant
答案 0 :(得分:11)
获取给定表的外键的简单方法:
SELECT
`column_name`,
`referenced_table_schema` AS foreign_db,
`referenced_table_name` AS foreign_table,
`referenced_column_name` AS foreign_column
FROM
`information_schema`.`KEY_COLUMN_USAGE`
WHERE
`constraint_schema` = SCHEMA()
AND
`table_name` = 'your-table-name-here'
AND
`referenced_column_name` IS NOT NULL
ORDER BY
`column_name`;
答案 1 :(得分:3)
INFORMATION_SCHEMA数据库包含所有其他数据库的完整模式的详细信息,包括约束:
http://dev.mysql.com/doc/refman/5.0/en/information-schema.html
您还可以运行SHOW CREATE TABLE查询以使SQL创建表,包括其约束。
答案 2 :(得分:0)
可以从MySQL的information_schema
检索很多,包括外键,如dev-null-dweller所指出。
SELECT * FROM information_schema.table_constraints
WHERE table_schema = 'dbname' AND table_name='mytable';
而不是dbname使用函数SCHEMA()
在USE
中设置数据库的名称。
正如Dan Grossman指出的那样,命令
SHOW CREATE TABLE `yourtablename`
基本上可以用来获取create table语句的SQL转储。
MySQL提供了一个SHOW KEYS命令。因此,如果您知道较低的基数阈值并且表中的其他键很少,理论上您可以获得FK。
SHOW KEYS FROM `address` WHERE Non_unique AND CARDINALITY > 10000
由于每次更改内部数据库时密钥的基数都会发生变化,因此这是理论上的。例如,在运行ANALYZE TABLE
时查看基数更改。
坚持命名架构很有用,例如foreigntablename_foreignfieldname
。例如,表user_id
中的字段billing
。大型Web内容框架的几个ORM使用此模式。
答案 3 :(得分:0)
基于this other thread中的Bill Karwin回答,我使用此解决方案来获取所需的所有信息,包括on_delete和on_update规则:
SELECT kcu.referenced_table_schema, kcu.constraint_name, kcu.table_name, kcu.column_name, kcu.referenced_table_name, kcu.referenced_column_name,
rc.update_rule, rc.delete_rule
FROM INFORMATION_SCHEMA.key_column_usage kcu
JOIN INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS rc on kcu.constraint_name = rc.constraint_name
WHERE kcu.referenced_table_schema = 'db_name'
AND kcu.referenced_table_name IS NOT NULL
ORDER BY kcu.table_name, kcu.column_name