Das*_*123 6 php mysql foreign-keys
PHP在mysql数据库上处理外键异常的最佳方法是什么?是否有一个可用于简化任何代码的mysql类?
理想情况下,作为一个例子,我想要做的是尝试删除一个记录,它是任意数量的子表的外键父.外键抛出异常,因此我希望能够查看每个外键表并对其进行测试,从而对表和引起异常的记录数提供有意义的反馈.然后将其作为错误返回,以便最终用户可以引用和删除违规记录.
我处理这个的方法是设置我的数据库包装类,以便在遇到数据库错误时始终抛出异常.因此,例如,我可能有一个MySQL使用以下函数调用的类:
public function query($query_string)
{
$this->queryId = mysql_query($query_string,$this->connectionId);
if (! $this->queryId) {
$this->_throwException($query_string);
}
return $this->queryId;
}
private function _throwException($query = null)
{
$msg = mysql_error().". Query was:\n\n".$query.
"\n\nError number: ".mysql_errno();
throw new Exception($msg,mysql_errno());
}
Run Code Online (Sandbox Code Playgroud)
每次查询失败时,都会抛出常规的PHP异常.请注意,我会从其他地方抛出这些,如connect()函数或selectDb()函数,这取决于操作是否成功.
有了这个设置,你很高兴.您希望可能需要处理数据库错误的任何地方,执行以下操作:
//assume $db has been set up to be an instance of the MySQL class
try {
$db->query("DELETE FROM parent WHERE id=123");
} catch (Exception $e) {
//uh-oh, maybe a foreign key restraint failed?
if ($e->getCode() == 'mysql foreign key error code') {
//yep, it failed. Do some stuff.
}
}
Run Code Online (Sandbox Code Playgroud)
编辑
根据下面的海报评论,您可以获得一些有限的信息来帮助诊断外键问题.由失败的外键约束创建并由返回的错误文本mysql_error()看起来像这样:
Cannot delete or update a parent row:
a foreign key constraint fails
(`dbname`.`childtable`, CONSTRAINT `FK_name_1` FOREIGN KEY
(`fieldName`) REFERENCES `parenttable` (`fieldName`));
Run Code Online (Sandbox Code Playgroud)
如果您的外键足够复杂,您无法确定哪个可能导致给定查询的外键错误,那么您可以解析此错误文本以帮助解决它.该命令还SHOW ENGINE INNODB STATUS返回最新外键错误的更详细结果.
否则,你可能不得不自己做一些挖掘.以下查询将为您提供给定表上的外键列表,您可以检查这些外键以获取信息:
select * from information_schema.table_constraints
WHERE table_schema=schema() AND table_name='table_name';
Run Code Online (Sandbox Code Playgroud)
不幸的是,除了非常仔细地检查错误和约束之外,我认为你的解决方案没有灵丹妙药.