【问题标题】:How to compare two queries if they affect the same row?如果它们影响同一行,如何比较两个查询?
【发布时间】:2012-03-09 14:54:00
【问题描述】:

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

我考虑过使用 select 选择受影响的查询条目,并检查两个查询中是否出现同一行:

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 表,但在另一个包含多列的表中失败 - 即使两个子选择完全相同。同样使用此解决方案,第一个子选择只能包含一个结果。

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

【问题讨论】:

  • IN(...) 子句使用子选择要求子选择仅返回单列值。当返回多个列时,SQL 将不知道您要比较 IN 内容的哪个字段。

标签: mysql compare row


【解决方案1】:

要获取将受两者影响的行,您只需要 WHERE 条件,只需执行;

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

IN 在设计上仅适用于单列结果,抱歉。

【讨论】:

  • 但是当我想比较一个包含限制并且可能还包含 order by 的删除语句时怎么办?我的问题是我不知道我会比较哪些查询,所以我必须涵盖所有情况......
  • 如果你的表有一个主键,比如说它是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);
【解决方案2】:

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

我选择相关查询的受影响条目并在我的应用程序中比较结果(在我的例子中,它是用 PHP 实现的)。

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

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

只是想和你分享这个。

【讨论】:

    猜你喜欢
    • 2020-02-20
    • 1970-01-01
    • 2011-04-15
    • 1970-01-01
    • 1970-01-01
    • 2020-06-08
    • 1970-01-01
    • 2020-07-17
    • 2017-12-03
    相关资源
    最近更新 更多