暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

[ACDU翻译] MySQL 9.2.2 标识符限定符

原创 由迪 2021-12-14
975

对象名称可以是非限定的或限定的。在名称解释明确的上下文中,允许使用非限定名称。限定名称至少包含一个限定符,通过覆盖默认上下文或提供缺失的上下文来阐明解释性上下文。

例如,此语句使用非限定名称创建一个表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仅出现在 table 中 t1c2仅出现在 中 t2,并且c同时出现在 t1和 中t2c在引用两个表的语句中,任何未限定的引用都是不明确的,并且必须限定为 t1.ct2.c指示您指的是哪个表:

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

同样,从表中检索t数据库db1和表 t数据库db2在同一语句,你必须限定表引用:对于那些表中的列参考文献,预选赛只需要对出现在两个表中列名。假设该列c1仅出现在 table 中 db1.tc2仅出现在 中 db2.t,并且c同时出现在 db1.t和 中db2.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;
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论