MariaDB: разница "ВНУТРЕННЕЕ СОЕДИНЕНИЕ ... ИСПОЛЬЗОВАНИЕ" и "ВНУТРЕННЕЕ СОЕДИНЕНИЕ ... ВКЛ" - PullRequest
0 голосов
/ 31 октября 2019

Я всегда думал, и поиск в 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)

ie USING - это просто синтаксический сахар для простого / общего случая, когда обе таблицы имеют одинаковые имена столбцов.

Теперь я наблюдаю разное поведение с MariaDB в Debian 9 и 10, где 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) |
+------+-------------+-------+------+---------------+------+---------+------+------+-----------------------------------------------------------------------------------------+

Что здесь происходит?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...