Related Documentation Download this Manual
PDF (US Ltr) - 40.8Mb
PDF (A4) - 40.9Mb
Man Pages (TGZ) - 294.0Kb
Man Pages (Zip) - 409.0Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb
Excerpts from this Manual

MySQL 8.3 Reference Manual  /  ...  /  Identifier Qualifiers

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 ...;
  • 列名称可以给定多个限定符,以在语句中指定上下文,如下表所示。

    Column Reference Meaning
    col_name col_name 来自语句中使用的任何表,其中包含该名称的列
    tbl_name.col_name col_name 来自默认数据库中的表 tbl_name
    db_name.tbl_name.col_name col_name 来自数据库 db_name 中的表 tbl_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 中,而 ct1t2 中都出现。任何未限定的 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 中,而 cdb1.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;