我正在创建一个类,该类从数据库中获取一个表,并将其显示在具有尽可能多功能的网页上。 我要支持的事情之一是让类检测表中的哪些列对其具有外键约束,以便它可以转到这些表,获取所有值并在选择中使用它们 -box,当您编辑这些字段时会被调用,以避免有人违反外键约束,
主要问题是发现哪些字段具有外键约束,以及它们指向哪些表。 有谁知道如何做到这一点???
谢谢,
Lemiant
不久前我问了同样的问题-请参阅stackoverflow.com/questions/273794/
获取给定表外键的简单方法:
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`;
谢谢,正是我想要的
当前连接的数据库的table_schema = DATABASE()。
我没有得到constraint_schema = SCHEMA()部分,constraint_schema只是约束的名称,对吗? 应该是table_schema = your-db-name-here
INFORMATION_SCHEMA数据库包含所有其他数据库的完整架构的详细信息,包括约束:
http://dev.mysql.com/doc/refman/5.0/en/information-schema.html
您还可以运行SHOW CREATE TABLE查询来获取创建表(包括其约束)的SQL。
要添加,FK信息仅在使用InnoDB存储的表上可用。 从手册中:For storage engines other than InnoDB, MySQL Server parses the FOREIGN KEY syntax in CREATE TABLE statements, but does not use or store it.
正如dev-null-dweller指出的那样,可以从MySQL的information_schema中检索很多内容,其中包括外键。
1个
SELECT * FROM information_schema.table_constraints
WHERE table_schema = 'dbname' AND table_name='mytable';
可以使用函数SCHEMA()代替dbname来在USE中设置数据库的名称。
2
正如Dan Grossman所指出的,
SHOW CREATE TABLE `yourtablename`
基本上可以用来获取create table语句的SQL转储。
?3
MySQL提供了SHOW KEYS命令。这样,如果您知道较低的基数阈值并且表中的其他键很少,则理论上可以得到FK。
SHOW KEYS FROM `address` WHERE Non_unique AND CARDINALITY > 10000
由于每次内部数据库更改时密钥的基数都会更改,因此这是理论上的。请参见基数更改,例如在运行ANALYZE TABLE的情况下。
?4
坚持使用命名架构(例如foreigntablename_foreignfieldname)很有用。例如,表billing中的字段user_id。大型Web内容框架的几个ORM使用此架构。