mysql - MariaDB:差异“INNER JOIN ... USING”和“INNER JOIN ... ON”
问题描述
我一直认为,在 Google/SO 上搜索似乎可以确认,这些都是一样的:
SELECT ... FROM a
INNER JOIN b ON (a.foo = b.foo AND a.bar = b.bar)
应该相当于
SELECT ... FROM a
INNER JOIN b USING (foo, bar)
ieUSING
只是两个表具有相同列名的简单/一般情况的语法糖。
现在我在 Debian 9 和 10 上观察 MariaDB 的不同行为,其中 9 符合我的预期,而 10 没有。
Debian 9:mysqld Ver 10.1.26-MariaDB-0+deb9u1 for debian-linux-gnu on x86_64 (Debian 9.1)
Debian 10:mysqld Ver 10.3.17-MariaDB-0+deb10u1 for debian-linux-gnu on x86_64 (Debian 10)
现在我有一个查询,它应该列出所有数据库中的所有约束及其相应的更新和删除规则。
这适用于两者:
SELECT a.CONSTRAINT_NAME, b.UPDATE_RULE, b.DELETE_RULE
FROM information_schema.KEY_COLUMN_USAGE a
INNER JOIN information_schema.REFERENTIAL_CONSTRAINTS b ON (
a.CONSTRAINT_CATALOG = b.CONSTRAINT_CATALOG
AND a.CONSTRAINT_SCHEMA = b.CONSTRAINT_SCHEMA
AND a.CONSTRAINT_NAME = b.CONSTRAINT_NAME
)
这会在 Debian 10 上返回一个空集,但在 9 上有效:
SELECT a.CONSTRAINT_NAME, b.UPDATE_RULE, b.DELETE_RULE
FROM information_schema.KEY_COLUMN_USAGE a
INNER JOIN information_schema.REFERENTIAL_CONSTRAINTS b
USING (CONSTRAINT_CATALOG, CONSTRAINT_SCHEMA, CONSTRAINT_NAME)
EXPLAIN
两个查询看起来也一样:
+------+-------------+-------+------+---------------+------+---------+------+------+-----------------------------------------------------------------------------------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+------+-------------+-------+------+---------------+------+---------+------+------+-----------------------------------------------------------------------------------------+
| 1 | SIMPLE | a | ALL | NULL | NULL | NULL | NULL | NULL | Open_full_table; Scanned all databases |
| 1 | SIMPLE | b | ALL | NULL | NULL | NULL | NULL | NULL | Using where; Open_full_table; Scanned all databases; Using join buffer (flat, BNL join) |
+------+-------------+-------+------+---------------+------+---------+------+------+-----------------------------------------------------------------------------------------+
这里发生了什么?
解决方案
推荐阅读
- r - 使用条件句沿数据框的列循环
- java - lombok 可以仅根据类型生成构建器吗?
- blazor - 如何将 Blazor Razor 类库中的 css / js 文件注入 ASP.NET Core Blazor 项目
- python - 从图中提取两个时间序列的 x,y 分量?
- javascript - 我的导航栏下拉菜单位于幻灯片后面。有人可以帮我弄清楚吗?
- c# - 为什么在与 Microsoft Graph API 通信时出现“AccessDenied”?
- gradle - 颤振,Gradle 无法在 https 上运行
- laravel - Laravel - 应该采取哪些步骤来使 Laravel 应用程序准备好进入生产模式
- c++ - 调整对齐的 Typedef
- javascript - Javascript在函数外调用可变结果?没有定义的?