2015-07-20 58 views
0

我正在写一个PHP应用程序,其中用户可以从列表中选择要删除的项目,但是我想要在尝试删除之前检查约束条件。然后,我可能会提前突出显示这些项目,提醒用户该约束。我可以编写一个所有约束的程序清单,并通过PHP进行检查,但是如果在线下,数据库端会添加其他约束条件?然后我需要在程序中定义这些新的约束条件。在删除行之前,有没有办法在MySql中检查约束违规?

基本上,是否有一个约束检查查询,可以运行,而无需实际尝试删除和捕获错误?

回答

0

据我所知,本身没有“DELETE CHECK”命令。

我的方法是扫描MySQL中的INFORMATION_SCHEMA表,其中记录了外键关系。从这些,可以生成SQL来检查删除是否会违反任何约束。

0

有没有人看到这样的解决方案的任何问题?我建立了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 
相关问题