在我发布问题之前,我想告诉大家,这不是 this 或 that 的重复,因为我不想解决特定问题,而是我想了解一个问题。阅读 docs ,我可以看到两个非常有趣的关于 update
命令内子查询的异常示例:
更新 t1 SET 列 2 = (从 t1 中选择 MAX(列 1));
错误是
Error 1093 (ER_UPDATE_TABLE_USED) SQLSTATE = HY000 Message = "You can't specify target table 'x' for update in FROM clause"
2.
SELECT * FROM t1 WHERE s1 IN (SELECT s2 FROM t2 ORDER BY s1 LIMIT 1)
错误是
ERROR 1235 (ER_NOT_SUPPORTED_YET) SQLSTATE = 42000 Message = "This version of MySQL doesn't yet support 'LIMIT & IN/ALL/ANY/SOME subquery'"
查看第一个示例,我可以看出更新 t1
的 column2
可能会也可能不会更改 column1
值,例如由于触发器或者如果列相同。但是,我想知道为什么 MySQL 会抛出错误,而不是正常评估子查询,或者至少确定命令运行时子查询的结果是否可能会被 update
更改?至于第二个例子,我真的不明白为什么MySQL不支持这种语法。我认为这些是 MySQL 的 bug,不知道是否有修复的时间表。
最佳答案
与其他一些 DBMS 相比,MySQL 是功能有限的 DBMS。由于多种原因,Oracle(MySQL 的所有者)并未消除所提到的这些限制。 MySQL 记录了您提到的限制。有多种方法可以解决您观察到的这些问题:
替换 1 的示例:
CREATE TEMPORARY TABLE ttt AS SELECT MAX(column1) col1 FROM t1;
UPDATE t1 SET column2 = (SELECT col1 FROM ttt);
替换 2 的示例:
CREATE VIEW ttt2 AS SELECT s2 FROM t2 ORDER BY s1 LIMIT 1;
SELECT * FROM t1 WHERE s1 IN (SELECT s2 ttt2);
(奇怪的是,虽然语法上是相同的,但它仍然有效......)。
可选:开始使用 MariaDB(100% 向后兼容 MySQL),并为该项目做出贡献。他们正在解决一些长期存在的功能问题。
关于MySQL更新子选择问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31410815/