我目前正在为项目编写后端RESTful API。这是问题所在。我有几张附有外键的表。
例如,我显示了_SANDBOX表,并显示了_JUNK_FK 外键表。
作为RESTful API的一部分,我想提供任何适用列的所有外键约束。例如:当前,如果客户端请求_SANDBOX表,API将返回一个标题,表示ID字段是int(11),NAME字段是varchar(255),DESCRIPTION字段是文本,JUNK_FOREIGN也是一个varchar(255)。
但是,正如我们在图像中看到的那样,JUNK_FOREIGN列具有限制,根据_JUNK_FK表。
我想知道的是:是否有一种高效的,仅限SQL或MySQLi的方法来检索具有关联列的给定表中的任何和所有外键约束?或者我必须执行多个查询:一个到INFORMATION_SCHEMA来获取外键表(在这种情况下只有_JUNK_FK),另一个用于从表中获取约束(再次从_JUNK_FK),第三个用于获取所需表的内容(在这种情况下_SANDBOX)?
到目前为止,我知道MySQLi fetch_columns()能力,但是这并没有提供有关外键约束的任何信息。
请指教。提前谢谢。
修改
以下是我一直在玩的一些代码。注意它需要两次调用数据库而不是一次。我不确定我是否对此感到满意,但它确实能够胜任。
// $table is defined previously (assume to be "_SANDBOX")
// $mysql is a MySQLi handle
$fkey_result = $mysql->query("SELECT `TABLE_NAME`, `REFERENCED_TABLE_NAME`, `COLUMN_NAME`, `REFERENCED_COLUMN_NAME` FROM `information_schema`.`KEY_COLUMN_USAGE` WHERE `TABLE_NAME` = '$table' AND `REFERENCED_TABLE_NAME` IS NOT NULL");
$column_constraints = array();
while($row = $fkey_result->fetch_array(MYSQLI_ASSOC))
{
$constraint_result = $mysql->query("SELECT `$row[REFERENCED_COLUMN_NAME]` FROM $row[REFERENCED_TABLE_NAME]");
$constraints = array();
while($constraint_row = $constraint_result->fetch_array(MYSQLI_NUM))
{
array_push($constraints, $constraint_row[0]);
}
$column_constraints[$row[COLUMN_NAME]] = $constraints;
}
// Printed out for debug info
print_r($column_constraints);