Spec-Zone.ru › MySQL 8.4

11.2.2 Квалификаторы идентификаторов

Имена объектов могут быть неквалифицированными или квалифицированными. Неквалифицированное имя допустимо в контекстах, где интерпретация имени однозначна. Квалифицированное имя включает по меньшей мере один квалификатор для уточнения контекста интерпретации, переопределяя контекст по умолчанию или предоставляя отсутствующий контекст.

Например, эта команда создает таблицу с использованием неквалифицированного имени t1:

CREATE TABLE t1 (i INT);

Поскольку t1 не содержит квалификатора для указания базы данных, команда создает таблицу в базе данных по умолчанию. Если базы данных по умолчанию нет, возникает ошибка.

Эта команда создает таблицу с использованием квалифицированного имени db1.t1:

CREATE TABLE db1.t1 (i INT);

Поскольку db1.t1 включает квалификатор базы данных db1, команда создает t1 в базе данных с именем db1, независимо от базы данных по умолчанию. Квалификатор обязателен при отсутствии базы данных по умолчанию. Квалификатор может быть указан, если база данных по умолчанию существует, для указания базы данных, отличной от базы данных по умолчанию, или для явного указания базы данных, если база данных по умолчанию совпадает с указанной.

Квалификаторы обладают следующими характеристиками:

  • Неквалифицированное имя состоит из одного идентификатора. Квалифицированное имя состоит из нескольких идентификаторов.

  • Компоненты имени из нескольких частей должны быть разделены точками (.) символами. Первые части имени из нескольких частей действуют как квалификаторы, которые влияют на контекст, в котором интерпретируется конечный идентификатор.

  • Символ квалификатора — отдельный токен и не обязательно должен быть смежным с связанными идентификаторами. Например, tbl_name.col_name и tbl_name . col_name эквивалентны.

  • Если какие-либо компоненты имени из нескольких частей требуют кавычек, их следует указывать индивидуально, а не имя целиком. Например, запишите `my-table`.`my-column`, а не `my-table.my-column`.

  • Зарезервированное слово, следующее за точкой в квалифицированном имени, должно быть идентификатором, поэтому в этом контексте его не нужно заключать в кавычки.

Допустимые квалификаторы для имен объектов зависят от типа объекта:

  • Имя базы данных полностью квалифицировано и не принимает квалификатор:

    CREATE DATABASE db1;
    
  • Имя таблицы, представления или хранимой программы может быть дополнено квалификатором имени базы данных. Примеры неквалифицированных и квалифицированных имен в операторах CREATE:

    CREATE TABLE mytable ...;
    CREATE VIEW myview ...;
    CREATE PROCEDURE myproc ...;
    CREATE FUNCTION myfunc ...;
    CREATE EVENT myevent ...;
    
    CREATE TABLE mydb.mytable ...;
    CREATE VIEW mydb.myview ...;
    CREATE PROCEDURE mydb.myproc ...;
    CREATE FUNCTION mydb.myfunc ...;
    CREATE EVENT mydb.myevent ...;
    
  • Триггер связан с таблицей, поэтому любой квалификатор применяется к имени таблицы:

    CREATE TRIGGER mytrigger ... ON mytable ...;
    
    CREATE TRIGGER mytrigger ... ON mydb.mytable ...;
    
  • Имя столбца может быть дополнено несколькими квалификаторами для указания контекста в операторах, которые ссылаются на него, как показано в следующей таблице.

    Ссылка на столбец Значение
    col_name Столбец col_name из той таблицы, которая используется в операторе, в которой есть столбец с таким же именем
    tbl_name.col_name Столбец col_name из таблицы tbl_name базы данных по умолчанию
    db_name.tbl_name.col_name Столбец col_name из таблицы tbl_name базы данных db_name

    Другими словами, имя столбца может быть дополнено квалификатором имени таблицы, который сам может быть дополнен квалификатором имени базы данных. Примеры неквалифицированных и квалифицированных ссылок на столбцы в операторах SELECT:

    SELECT c1 FROM mytable
    WHERE c2 > 100;
    
    SELECT mytable.c1 FROM mytable
    WHERE mytable.c2 > 100;
    
    SELECT mydb.mytable.c1 FROM mydb.mytable
    WHERE mydb.mytable.c2 > 100;
    

Квалификатор для ссылки на объект в операторе не требуется, если неквалифицированная ссылка не является неоднозначной. Предположим, что столбец c1 встречается только в таблице t1, c2 только в t2, а c — в обеих таблицах t1 и t2. Любая неквалифицированная ссылка на c неоднозначна в операторе, который ссылается на обе таблицы, и должна быть квалифицирована как t1.c или t2.c для указания нужной таблицы:

SELECT c1, c2, t1.c FROM t1 INNER JOIN t2
WHERE t2.c > 100;

Аналогично, для извлечения данных из таблицы t в базе данных db1 и из таблицы t в базе данных db2 в одном операторе необходимо квалифицировать ссылки на таблицы. Для ссылок на столбцы в этих таблицах квалификаторы требуются только для имен столбцов, которые встречаются в обеих таблицах. Предположим, что столбец c1 встречается только в таблице db1.t, c2 только в db2.t, а c — в обеих таблицах db1.t и db2.t. В этом случае c неоднозначен и должен быть квалифицирован, но c1 и c2 — нет:

SELECT c1, c2, db1.t.c FROM db1.t INNER JOIN db2.t
WHERE db2.t.c > 100;

Псевдонимы таблиц позволяют проще записывать квалифицированные ссылки на столбцы:

SELECT c1, c2, t1.c FROM db1.t AS t1 INNER JOIN db2.t AS t2
WHERE t2.c > 100;

© 2025 Oracle
Licensed under the GPLv2 License.
https://docs.oracle.com/cd/E17952_01/mysql-8.4-en/identifier-qualifiers.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API