Я всегда думал, и поиск в 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) |
+------+-------------+-------+------+---------------+------+---------+------+------+-----------------------------------------------------------------------------------------+
Что здесь происходит?