Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/283.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/87.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php SQL-检查单个表的依赖项_Php_Sql_Database_Foreign Keys_Relational - Fatal编程技术网

Php SQL-检查单个表的依赖项

Php SQL-检查单个表的依赖项,php,sql,database,foreign-keys,relational,Php,Sql,Database,Foreign Keys,Relational,假设您有一个表(a),其中包含有限的数据量,并且作为主键的一个字段被其他表中的多个外键引用,而不是一个 这些表的外键对前面提到的表(A)有约束,如果删除表(A)中的一行,而另一个表FKs持有对该行的引用,则删除操作将失败 好的,考虑到数据库设计,现在是软件的问题,在本例中是PHP。如果试图从表(a)中删除一行,应如何进行检查以确保在保留引用的情况下无法删除该行 我曾见过这样的情况,即每个表都是事先检查的,但这涉及到在每次检查中进行编码,这会成为维护的噩梦。此外,我不能简单地让删除尝试,因为这需要

假设您有一个表(a),其中包含有限的数据量,并且作为主键的一个字段被其他表中的多个外键引用,而不是一个

这些表的外键对前面提到的表(A)有约束,如果删除表(A)中的一行,而另一个表FKs持有对该行的引用,则删除操作将失败

好的,考虑到数据库设计,现在是软件的问题,在本例中是PHP。如果试图从表(a)中删除一行,应如何进行检查以确保在保留引用的情况下无法删除该行

我曾见过这样的情况,即每个表都是事先检查的,但这涉及到在每次检查中进行编码,这会成为维护的噩梦。此外,我不能简单地让删除尝试,因为这需要一个跨数据库的应用程序,因此返回的错误代码将不一致


我很想知道人们通常是如何处理这种情况的。我提到我正在使用PHP,但这种情况在任何语言中都应该适用。

通常,您可以通过尝试在主键表上执行DELETE语句、捕获异常并在事务发生时回滚来处理此问题。然后,您可以以任何形式向用户报告故障。如果所有引用表真的将外键声明回主键表,那么这种方法是有效的


如果确实需要先检查,则需要编写代码“内省”数据库中存在的键,提取每个引用外键的表和列名,并对每个表发出SELECT计数。不幸的是,每个数据库引擎都有自己的方法来了解数据库结构,因此您必须为想要支持的每个数据库引擎编写一些代码。

使用回滚并通过函数收集错误数据,如
mysqli\u error\u list
mysqli\u errno
PDO::errorInfo
PDO::errorCode
PDOStatement::errorCode
不是一个选项?这是一个选项,也是我第一次想到的,但我需要绕过不同的数据库,为相同类型的操作返回不同的错误代码。这两种解决方案都是我想要避免的情况,但我猜,在设计应用程序时,一定要考虑到特定的数据库,以及在使用第一个解决方案时返回的错误代码的处理程序。现在我将尝试第二种解决方案,但是如果使引用的表数量变得如此之大以至于不可行,我将尝试切换到第一种解决方案,并为特定数据库构建一个错误代码列表以及它们的含义。谢谢如果您准备帮助我找到某种常量库,它将不同的数据库错误代码规范化为预定义的常量,并根据使用PDO驱动程序的不同值声明,我将提出另一个问题并将其链接到此处。第二个解决方案不需要对每个引用表进行特殊编码。实际上,您从数据库本身读取引用表的列表。您只需要编写一次内省代码(每个引擎一次),它将适用于所有表,并在将来添加约束时继续工作。对于MySQL示例,请参见:。啊,我明白了,因此可以使用“select TABLE_NAME,COLUMN_NAME”返回的值来生成一个包含“select COUNT”子查询的查询,或者可以使用TABLE_NAME和COLUMN_NAME在单个查询中完成该任务,以动态更改嵌套的where,并对每个查询进行计数。虽然它听起来很聪明,但它看起来确实有点像黑客,因为它针对数据库设置本身运行查询。有没有一种方法可以使第一个解决方案在多个驱动程序之间可行?从我可以看出,上述情况下的错误代码类是23,但是,据我所知,并不是每个pdo驱动程序都会返回该类。