2012-03-09 74 views
0

我必须检查两个查询(例如更新和删除语句)是否影响MySQL数据库中的同一行。如何比较两个查询是否影响同一行?

我想到了一个选择选择查询受影响的条目,并检查是否在同一行出现在两个查询:

UPDATE Foo SET col = 'a' WHERE id > 5; 
DELETE FROM Foo WHERE col = 'b'; 

SELECT (SELECT * FROM Foo WHERE col = 'b') IN (SELECT * FROM Foo WHERE id > 5); 

在实践中它的工作对我的简单Foo表,但在另一个表故障与几列 - 即使当两个子选择完全相同。同样对于这个解决方案,第一个子选择只能包含一个结果。

有谁知道另一个解决方案或上述选择可能会失败与另一个表的原因?

+0

对子句IN'(...)'子句的使用要求子查询只返回一列值。当多个列被返回时,SQL不会知道你想要比较的WHI字段。 – 2012-03-09 15:23:54

回答

0

我现在用PHP解决了我的部分问题,而不是只用MySQL来解决问题。

我选择相关查询的受影响条目,并将结果与​​我的应用程序进行比较(在我的情况下,它是用PHP实现的)。

为什么我不通过对MySQL的一个查询来解决它? 现在我必须比较查询,我不知道查询给出的任何其他内容。我仍然知道哪些表受到影响以及哪些列,但我不知道这些表是如何构建的或哪些列是主键(或者甚至有多个主键)。这就是为什么我或多或少地在PHP中编写我自己的IN函数。

解决方案的另一种方法是从MySQL获取主键(例如使用DESCRIBE)并使用Joachim Isaksson描述的解决方案。

只是想与你分享。

0

要获得将受到影响的行只需要WHERE条件,只需做;

SELECT * FROM Foo WHERE (col='b') AND (id>5); 

IN只适用于设计的单列结果,抱歉。

+0

但是,当我想比较包含限制和可能还包括订单的删除语句时,是什么情况?我的问题是,我不知道我会比较哪些查询,所以我必须涵盖所有情况... – Zwie 2012-03-09 15:30:36

+0

如果您的表具有主键,我们假设它是'id'作为示例,您可以执行“ IN'使用该查询; SELECT * FROM Foo WHERE id IN(SELECT id FROM Foo WHERE col ='b')AND ID IN(SELECT id FROM Foo WHERE id> 5);' – 2012-03-09 15:38:06

相关问题