• Schema Object Names
    • Identifier Qualifiers

    Schema Object Names

    在 TiDB 中,包括 database,table,index,column,alias 等等都被认为是 identifier (标识符,之后阐述用英文).

    在 TiDB 中,identifier可以被反引号 (`) 包裹,为了阐述方便,我们叫这种情况为 被引用。identifier 也可以不被 ` 包裹。但是如果一个 identifier 存在一个特殊符号或者是一个保留关键字,那么你必须要 引用 它。

    1. mysql> SELECT * FROM `table` WHERE `table`.id = 20;

    如果ANSI_QUOTES sql mode 被设置了,那么我们认为被双引号 " 包裹的字符串为 identifier。

    1. mysql> CREATE TABLE "test" (a varchar(10));
    2. ERROR 1105 (HY000): line 0 column 19 near " (a varchar(10))" (total length 35)
    3. mysql> SET SESSION sql_mode='ANSI_QUOTES';
    4. Query OK, 0 rows affected (0.00 sec)
    5. mysql> CREATE TABLE "test" (a varchar(10));
    6. Query OK, 0 rows affected (0.09 sec)

    如果你需要在被引用的 identifier 中使用反引号这个字符,那你需要重复两次,例如你需要创建一个表为 a`b:

    1. mysql> CREATE TABLE `a``b` (a int);

    在 select 语句中,alias 语句可以用 identifier 或者字符串:

    1. mysql> SELECT 1 AS `identifier`, 2 AS 'string';
    2. +------------+--------+
    3. | identifier | string |
    4. +------------+--------+
    5. | 1 | 2 |
    6. +------------+--------+
    7. 1 row in set (0.00 sec)

    更多细节

    Identifier Qualifiers

    Object Names (对象名字) 可以被限定也可以不用。例如你可以在创建表的时候不指定 database names:

    1. CREATE TABLE t (i int);

    但是如果你之前没有设定过默认的数据库,会报 ERROR 1046 (3D000): No database selected 错误。当然你也可以指定数据库限定名:

    1. CREATE TABLE test.t (i int);

    对于 . 左右两端可以出现空格,table_name.col_name 等于 table_name . col_name

    如果你要引用这个 identifier,那么请使用:

    1. `table_name`.`col_name`

    而不是:

    1. `table_name.col_name`

    更多细节