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;