Documentation Home
MySQL 8.0 リファレンスマニュアル
Download this Manual
PDF (US Ltr) - 36.1Mb
PDF (A4) - 36.2Mb


このページは機械翻訳したものです。

9.2.2 識別子の修飾子

オブジェクト名は、修飾されていない場合と修飾されている場合があります。 名前の解釈があいまいでないコンテキストでは、修飾されていない名前を使用できます。 修飾名には、デフォルトコンテキストをオーバーライドするか、欠落しているコンテキストを提供することによって解釈コンテキストを明確にするための修飾子が少なくとも 1 つ含まれています。

たとえば、次のステートメントは、修飾されていない名前 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 がテーブル t1t2 のみの c2 および t1t2 の両方の c に出現するとします。 c への修飾されていない参照は、両方のテーブルを参照するステートメントであいまいであり、どのテーブルを意味するかを示すために t1.c または t2.c として修飾する必要があります:

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

同様に、データベース db1 のテーブル t および同じステートメントのデータベース db2 のテーブル t から取得するには、テーブル参照を修飾する必要があります: これらのテーブルのカラムを参照する場合、修飾子は両方のテーブルに表示されるカラム名にのみ必要です。 カラム c1 がテーブル db1.tdb2.t のみの c2 および db1.tdb2.t の両方の c に出現するとします。 この場合、c はあいまいであり、修飾する必要がありますが、c1 および c2 は次のようにする必要はありません:

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;