gpt4 book ai didi

mysql - 自 MySQL 5.5.3 以来,如果不选择数据库就无法使用别名引用进行删除?

转载 作者:可可西里 更新时间:2023-11-01 06:46:18 24 4
gpt4 key购买 nike

我曾经像这样进行复杂的多表删除:

DELETE db1.t1 FROM db1.table1 AS t1, db1.table2 AS t2...

现在升级到 MySQL 5.5.5 后不再工作,因为根据文档,因为 5.5.3 别名不允许在 DELETE 语句中使用数据库名称进行限定。所以我应该这样做:

DELETE t1 FROM db1.table1 AS t1, db1.table2 AS t2...

由于 bug #61376 而不起作用并给出错误 1046 (3D000):未选择数据库。

我不使用数据库,因为我的代码应该可以集成到未知环境中,而选择数据库可能会破坏现有代码。

我是否应该假设自 MySQL 5.5.3 以来不选择数据库就不可能使用别名引用的 DELETE 语句,我应该开始寻找一个肮脏的 hack 或者你知道一个干净的解决方案吗?


更新:

当没有选择数据库时,在此查询之前添加一个 USE db1(Bill Karwin 的建议):

DELETE t1 FROM db1.table1 AS t1, db1.table2 AS t2...

使它在 5.5.5 中工作,但在 4.1 和 5.1 中都出现此错误:

ERROR 1109 (42S02): Unknown table 't1' in MULTI DELETE

我想现在我要完全放弃使用别名,而是在所有地方使用完整的 db.table 名称,这会使查询变得庞大且不可读,但我想不出任何更好的解决方案。

最佳答案

我只想准备一个默认数据库。不幸的是,这是必要的,但与访问表的任何实际查询相比,USE db1 确实不是要运行的重量级语句。

您不必为每个 DELETE 执行两次查询。错误报告中显示的 SELECT DATABASE() 不是必需的,它只是表明没有选择默认数据库。

您只需要为每个 session 准备一次默认数据库,例如在您连接之后,而不是在每个语句之前。


回复你的评论:

如果您正在使用另一个数据库,那么错误就会消失。只有当您没有数据库作为您的默认数据库时,您的别名才会出错。您不必准备好 db1 即可从中删除。

我现在没有时间测试所有的排列,所以部分是基于假设。


关于您的更新:

多年来,MySQL 的行为发生了几次变化。我建议您建议升级 5.1 之前的任何 MySQL,并确保您使用的是 InnoDB 插件。它不仅会简化您的开发,而且您将获得他们近年来所做的可扩展性改进。

MySQL 4.1/5.0/5.1 说:

As of MySQL 4.1.2, aliases can be used, but for alias references in the list of tables from which to delete rows, the default database is used unless one is specified explicitly.

To correctly match an alias that refers to a table outside the default database, you must explicitly qualify the reference with the name of the proper database:

DELETE a1, db2.a2 FROM db1.t1 AS a1 INNER JOIN db2.t2 AS a2
WHERE a1.id=a2.id;

MySQL 5.5 说:

As of MySQL 5.5.3, alias resolution does not require qualification and alias references should not be qualified with the database name. Qualified names are interpreted as referring to tables, not aliases.

所以您是对的,您不能在跨多个数据库的多表删除中使用别名,针对 4.1/5.0/5.1 和 5.5 使用相同的代码。解决方法是跳过别名并提供由数据库限定的表的全名。

这应该有效,除非您有涉及自连接和跨数据库连接的多表 DELETE。

关于mysql - 自 MySQL 5.5.3 以来,如果不选择数据库就无法使用别名引用进行删除?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6634987/

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