MySQL更新子选择问题

标签 mysql sql-update

在我发布问题之前,我想告诉大家,这不是 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/

相关文章:

mysql - 我们可以使用 sqoop 导出特殊字符吗?

PHP数组输出到列表

c# - 从 id 列表更新 Entity Framework 中的多行

php - 这个查询有什么问题?我正在尝试根据第二个表中列的值更新列值

php - mysql_query 字符串不更新

mysql - 基于多个表更新单个表 - 似乎适用于 MySql 而不是 ACCESS 2003

php - 排队作业卡住,表可能在 Laravel 中被锁定

mysql - 获取从一个表中的全文字段到另一表中的另一个全文字段的总子字符串匹配计数

mysql - 有没有办法在 MySQL 中提交后回滚?

php - 相同的查询效果不同