首页 > 解决方案 > 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) |
+------+-------------+-------+------+---------------+------+---------+------+------+-----------------------------------------------------------------------------------------+

这里发生了什么?

标签: mysqljoinmariadb

解决方案


推荐阅读