Before I execute SQL query, I'd like to check if foreign key constraint will be violated. Is this possible?
问问题
64 次
1 回答
2
您可以使用 SELECT 语句检查外键是否存在。要以完全透明的方式执行此操作,您需要编写代码来检查系统表或 information_schema 视图,动态构建正确的 SELECT 语句,然后执行它并检查结果。您可以对大部分内容进行硬编码,但只有冒着执行基于不再存在的假设的代码的风险。(可能会删除 FK、重命名表等)
但是这两种方法都存在一些问题。
- 您必须将该 SELECT 语句(或多个语句)和INSERT 或 UPDATE 语句放在一个事务中。否则,您可能会在更新之前验证其他人删除的值是否存在。换句话说,您的 SELECT 成功,其他人的 DELETE(或 UPDATE)成功,您的 INSERT(或 UPDATE)应该成功,但由于事务处理不当而失败。
- 服务器必须为每个 INSERT 或 UPDATE 语句处理两个查询。(这还不包括对系统表的查询。)
- 无论如何,您仍然必须在应用程序级别捕获错误。有很多事情可以阻止合理的事务提交。
由于无论如何您都必须捕获错误,因此只发出 INSERT 或 UPDATE 语句并捕获表明您违反外键约束的错误通常更有意义。
于 2013-04-03T16:10:53.310 回答