MySQL 9.0 参考手册  /  ...  /  标识符限定符

11.2.2 标识符限定符

对象名称可以是无限定的或限定的。在解释名称没有歧义的上下文中,允许使用无限定名称。限定名称包含至少一个限定符,以通过覆盖默认上下文或提供缺失上下文来澄清解释上下文。

例如,以下语句使用无限定名称 t1 创建一个表

CREATE TABLE t1 (i INT);

因为 t1 不包含指定数据库的限定符,所以该语句在默认数据库中创建该表。如果不存在默认数据库,则会发生错误。

以下语句使用限定名称 db1.t1 创建一个表

CREATE TABLE db1.t1 (i INT);

因为 db1.t1 包含数据库限定符 db1,所以该语句在名为 db1 的数据库中创建 t1,而不管默认数据库是什么。如果不存在默认数据库,则必须指定限定符。如果存在默认数据库,则可以指定限定符,以指定与默认数据库不同的数据库,或者如果默认数据库与指定的数据库相同,则明确指定数据库。

限定符具有以下特征

  • 无限定名称由单个标识符组成。限定名称由多个标识符组成。

  • 多部分名称的组成部分必须用句点 (.) 字符隔开。多部分名称的初始部分充当限定符,影响解释最终标识符的上下文。

  • 限定符字符是一个单独的标记,不需要与关联的标识符相连。例如,tbl_name.col_nametbl_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 来自默认数据库的 tbl_name 表的 col_name
    db_name.tbl_name.col_name 来自 db_name 数据库的 tbl_name 表的 col_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 同时出现在 t1t2 表中。在引用这两个表的语句中,任何对 c 的无限定引用都是有歧义的,必须限定为 t1.ct2.c 来指示您的意图

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

类似地,要在同一语句中从 db1 数据库中的 t 表和 db2 数据库中的 t 表中检索数据,您必须限定表引用:对于这些表中的列引用,只有同时出现在两个表中的列名称需要限定符。假设 c1 列仅出现在 db1.t 表中,c2 仅出现在 db2.t 表中,而 c 同时出现在 db1.tdb2.t 表中。在这种情况下,c 是有歧义的,必须限定,但 c1c2 不需要限定

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;