gpt4 book ai didi

MySQL更新子选择问题

转载 作者:行者123 更新时间:2023-11-29 22:13:27 25 4
gpt4 key购买 nike

在我发布问题之前,我想告诉大家,这不是 thisthat 的重复,因为我不想解决特定问题,而是我想了解一个问题。阅读 docs ,我可以看到两个非常有趣的关于 update 命令内子查询的异常示例:

  1. 更新 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'"

查看第一个示例,我可以看出更新 t1column2 可能会也可能不会更改 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com