我正在写一个PHP应用程序,其中用户可以从列表中选择要删除的项目,但是我想要在尝试删除之前检查约束条件。然后,我可能会提前突出显示这些项目,提醒用户该约束。我可以编写一个所有约束的程序清单,并通过PHP进行检查,但是如果在线下,数据库端会添加其他约束条件?然后我需要在程序中定义这些新的约束条件。在删除行之前,有没有办法在MySql中检查约束违规?
基本上,是否有一个约束检查查询,可以运行,而无需实际尝试删除和捕获错误?
我正在写一个PHP应用程序,其中用户可以从列表中选择要删除的项目,但是我想要在尝试删除之前检查约束条件。然后,我可能会提前突出显示这些项目,提醒用户该约束。我可以编写一个所有约束的程序清单,并通过PHP进行检查,但是如果在线下,数据库端会添加其他约束条件?然后我需要在程序中定义这些新的约束条件。在删除行之前,有没有办法在MySql中检查约束违规?
基本上,是否有一个约束检查查询,可以运行,而无需实际尝试删除和捕获错误?
据我所知,本身没有“DELETE CHECK”命令。
我的方法是扫描MySQL中的INFORMATION_SCHEMA
表,其中记录了外键关系。从这些,可以生成SQL来检查删除是否会违反任何约束。
有没有人看到这样的解决方案的任何问题?我建立了schtever关于使用information_schema数据的建议。我已经将这种方法添加到我的数据库类中,并且从一些简单的测试中,它似乎工作。它会告诉我,如果在任何匹配约束的数据库表中找到传递给它的键,则第一个约束失败。如果任何表中没有键匹配,则返回false,表示不存在约束。
/**
* hasDeleteConstraints - This method uses the MySQL information_schema information to check for
* constraint violations. If violations are found, the method returns the
* constraint name and the table name of where matching data is found.
*
* @param string $table The database table being checked
* @param string $field The key field to check
* @param string $value The value to search for
*
* @return mixed - The matching constraint data if found, false if no constraints found
*/
public static function hasDeleteConstraints($table, $field, $value) {
$sql = "SELECT KCU.CONSTRAINT_NAME, KCU.TABLE_NAME, KCU.COLUMN_NAME
FROM information_schema.KEY_COLUMN_USAGE KCU
LEFT JOIN information_schema.REFERENTIAL_CONSTRAINTS REFC USING(CONSTRAINT_NAME)
WHERE KCU.REFERENCED_TABLE_NAME = " . self::quote($table) . "
AND KCU.REFERENCED_COLUMN_NAME = " . self::quote($field) . "
AND REFC.DELETE_RULE = 'RESTRICT'
GROUP BY KCU.CONSTRAINT_NAME";
$result = self::dbQueryAll($sql);
if ($result) {
foreach ($result as $row) {
$sql = "SELECT {$row['COLUMN_NAME']}
FROM {$row['TABLE_NAME']}
WHERE {$row['COLUMN_NAME']} = " . self::quote($value);
if (self::dbQueryRow($sql) !== false) {
return $row;
}
}
}
return false;
} //End public static function hasDeleteConstraints