Loading...
MySQL 9.5 Reference Manual 9.5의 11.2.2 Identifier Qualifiers의 한국어 번역본입니다.
아래의 경우에 피드백에서 신고해주신다면 반영하겠습니다.
감사합니다 :)
Object name은 정규화될(qualified) 수도 있고, 정규화되지 않을(unqualified) 수도 있습니다. Unqualified name은 그 name의 해석이 모호하지 않은 컨텍스트에서 허용됩니다. Qualified name은 하나 이상의 qualifier를 포함하여, 기본 컨텍스트를 재정의하거나 누락된 컨텍스트를 제공함으로써 해석 컨텍스트를 명확히 합니다.
예를 들어, 다음 구문(statement)은 unqualified name t1을 사용하여 테이블을 생성합니다:
1CREATE TABLE t1 (i INT);
t1은 데이터베이스를 지정하는 qualifier를 포함하지 않으므로, 이 구문은 기본(default) 데이터베이스에 테이블을 생성합니다. 기본 데이터베이스가 없으면 에러가 발생합니다.
다음 구문은 qualified name db1.t1을 사용하여 테이블을 생성합니다:
1CREATE TABLE db1.t1 (i INT);
db1.t1은 데이터베이스 qualifier db1을 포함하므로, 이 구문은 기본 데이터베이스와 상관없이 db1이라는 이름의 데이터베이스에 t1을 생성합니다. 기본 데이터베이스가 없으면 qualifier를 반드시(must) 지정해야 합니다. 기본 데이터베이스가 있는 경우에도 기본값과 다른 데이터베이스를 지정하기 위해, 또는 기본으로 지정된 데이터베이스와 동일함을 명시적으로 나타내기 위해 qualifier를 지정할 수(may) 있습니다.
Qualifier는 다음과 같은 특성을 가집니다:
Unqualified name은 하나의 식별자(identifier)로 구성됩니다. Qualified name은 여러 식별자로 구성됩니다.
다중 파트 이름(Multiple-part name)의 구성 요소는 마침표(.) 문자로 구분되어야 합니다. 다중 파트 이름의 앞쪽 부분은 qualifier로서 작용하여 마지막 식별자를 해석해야 할 컨텍스트에 영향을 줍니다.
Qualifier 문자는 별도의 토큰(token)이며 관련 식별자들과 연속적일 필요가 없습니다. 예를 들어, tbl_name.col_name 과 tbl_name . col_name 은 동일합니다.
다중 파트 이름의 어떤 구성 요소든 quoting이 필요하다면, 전체 name을 한 번에 quoting하는 대신 각 구성 요소를 개별적으로 quoting해야 합니다. 예를 들어, my-table`.`my-column라고 작성해야 하고, my-table.my-column라고 작성해서는 안 됩니다.
Qualified name에서 마침표 뒤에 오는 예약어(reserved word)는 식별자여야 하므로, 그 컨텍스트에서는 quoting할 필요가 없습니다.
Object name에 허용되는 qualifier는 object type에 따라 다릅니다:
1CREATE DATABASE db1;
CREATE 구문에서 unqualified 및 qualified name의 예는 다음과 같습니다:1CREATE TABLE mytable ...; 2CREATE VIEW myview ...; 3CREATE PROCEDURE myproc ...; 4CREATE FUNCTION myfunc ...; 5CREATE EVENT myevent ...; 6 7CREATE TABLE mydb.mytable ...; 8CREATE VIEW mydb.myview ...; 9CREATE PROCEDURE mydb.myproc ...; 10CREATE FUNCTION mydb.myfunc ...; 11CREATE EVENT mydb.myevent ...;
1CREATE TRIGGER mytrigger ... ON mytable ...; 2 3CREATE TRIGGER mytrigger ... ON mydb.mytable ...;
| Column Reference | Meaning |
|---|---|
col_name | 해당 구문에서 사용된 테이블들 중<br> 그 이름의 컬럼을 포함하는 어느 테이블에서든<br> 컬럼 col_name |
tbl_name.col_name | 기본 데이터베이스의 테이블<br> tbl_name 의 컬럼<br> col_name |
db_name.tbl_name.col_name | 데이터베이스<br> db_name 의 테이블<br> tbl_name 의 컬럼<br> col_name |
즉, 컬럼 이름에는 테이블 이름(table-name) qualifier를 줄 수 있고, 이 테이블 이름 qualifier 자체에는 데이터베이스 이름(database-name) qualifier를 줄 수 있습니다. SELECT 구문에서 unqualified 및 qualified 컬럼 참조의 예는 다음과 같습니다:
1SELECT c1 FROM mytable 2WHERE c2 > 100; 3 4SELECT mytable.c1 FROM mytable 5WHERE mytable.c2 > 100; 6 7SELECT mydb.mytable.c1 FROM mydb.mytable 8WHERE mydb.mytable.c2 > 100;
구문에서 오브젝트 참조의 unqualified 참조가 모호하지 않은 한 qualifier를 지정할 필요는 없습니다. 컬럼 c1은 테이블 t1에만, c2는 t2에만, c는 t1과 t2 모두에 존재한다고 가정해 봅니다. 두 테이블 모두를 참조하는 구문에서 c에 대한 unqualified 참조는 모호하므로, 어느 테이블을 의미하는지 나타내기 위해 t1.c 또는 t2.c로 qualifier를 지정해야 합니다:
1SELECT c1, c2, t1.c FROM t1 INNER JOIN t2 2WHERE t2.c > 100;
비슷하게, 하나의 구문에서 데이터베이스 db1의 테이블 t와 데이터베이스 db2의 테이블 t에서 데이터를 가져오려면, 테이블 참조에 qualifier를 지정해야 합니다. 그 테이블들의 컬럼을 참조할 때, qualifier는 두 테이블 모두에 존재하는 컬럼 이름에 대해서만 필요합니다. 컬럼 c1은 테이블 db1.t에만, c2는 db2.t에만, c는 db1.t와 db2.t 모두에 존재한다고 가정해 봅니다. 이 경우 c는 모호하므로 qualifier를 지정해야 하지만, c1과 c2는 그럴 필요가 없습니다:
1SELECT c1, c2, db1.t.c FROM db1.t INNER JOIN db2.t 2WHERE db2.t.c > 100;
테이블 별칭(table alias)을 사용하면 qualified 컬럼 참조를 더 간단하게 작성할 수 있습니다:
1SELECT c1, c2, t1.c FROM db1.t AS t1 INNER JOIN db2.t AS t2 2WHERE t2.c > 100;
11.2.1 Identifier Length Limits
11.2.3 Identifier Case Sensitivity