데이터 정의 언어

Cloud Spanner의 데이터 정의 언어(DDL)를 사용하여 다음을 수행합니다.

  • 데이터베이스를 만듭니다.
  • 데이터베이스의 테이블을 생성, 변경, 삭제합니다.
  • 테이블의 열을 추가, 변경, 삭제합니다.
  • 데이터베이스의 색인을 만들거나 삭제합니다.
  • 데이터베이스에서 뷰를 만들거나 바꾸거나 삭제합니다.

DDL 구문

statement:
    { create_database | alter_database
    | create_table | alter_table | drop_table
    | create_index | drop_index
    | create_view | drop_view }

create_database:
    CREATE DATABASE database_id

alter_database:
    ALTER DATABASE database_id
    action

where action is:
    SET OPTIONS ( options_def [, ... ] )

and options_def is:
    { default_leader = { 'region' | null } |
      optimizer_version = { 1 ... 3 | null } |
      optimizer_statistics_package = { 'package_name' | null } |
      version_retention_period = { 'duration' | null } }

create_table:
    CREATE TABLE table_name ( [
       { column_name data_type [NOT NULL] [AS ( expression ) STORED] [ options_def ]
       | table_constraint }
       [, ... ]
    ] ) PRIMARY KEY ( [ column_name [ { ASC | DESC } ], ...] )
    [, INTERLEAVE IN PARENT table_name [ ON DELETE { CASCADE | NO ACTION } ] ]
    [, ROW DELETION POLICY ( OLDER_THAN ( timestamp_column, INTERVAL num_days DAY ) ) ]

    where data_type is:
        { scalar_type | array_type }

    and options_def is:
        { OPTIONS ( allow_commit_timestamp = { true | null } ) }

    and table_constraint is:
        [ CONSTRAINT constraint_name ]
        { CHECK ( expression ) |
          FOREIGN KEY ( column_name [, ... ] ) REFERENCES ref_table ( ref_column [, ... ] ) }

create_index:
    CREATE [ UNIQUE ] [ NULL_FILTERED ] INDEX index_name
    ON table_name ( key_part [, ...] ) [ storing_clause ] [ , interleave_clause ]

    where index_name is:
        {a—z|A—Z}[{a—z|A—Z|0—9|_}+]

    and key_part is:
        column_name [ { ASC | DESC } ]

    and storing_clause is:
        STORING ( column_name [, ...] )

    and interleave_clause is:
        INTERLEAVE IN table_name

create_view:
    { CREATE VIEW | CREATE OR REPLACE VIEW } view_name
    SQL SECURITY INVOKER
    AS query

alter_table:
    ALTER TABLE table_name
    action [, ... ]

    where action is:
        ADD [ COLUMN ] column_name data_type [ NOT NULL ] [AS ( expression ) STORED] [ options_def ]
        DROP [ COLUMN ] column_name
        ADD table_constraint
        DROP CONSTRAINT constraint_name
        SET ON DELETE { CASCADE | NO ACTION }
        ALTER [ COLUMN ] column_name { { data_type } [ NOT NULL ] | SET [ options_def ] }
        ADD ROW DELETION POLICY ( OLDER_THAN ( timestamp_column, INTERVAL num_days DAY ))
        DROP ROW DELETION POLICY
        REPLACE ROW DELETION POLICY ( OLDER_THAN ( timestamp_column, INTERVAL num_days DAY ))

    and data_type is:
        { scalar_type | array_type }

    and options_def is:
        { OPTIONS ( allow_commit_timestamp = { true | null } ) }

    and table_constraint is:
        [ CONSTRAINT constraint_name ]
        { CHECK ( expression ) |
          FOREIGN KEY ( column_name [, ... ] ) REFERENCES ref_table ( ref_column [, ... ] ) }

drop_table:
    DROP TABLE table_name

drop_index:
    DROP INDEX index_name

drop_view:
    DROP VIEW view_name

alter_statistics:
    ALTER STATISTICS package_name

scalar_type:
    { BOOL | INT64 | FLOAT64 | NUMERIC | STRING( length ) | JSON | BYTES( length ) | DATE | TIMESTAMP }

length:
    { int64_value | MAX }

array_type:
    ARRAY< scalar_type >

int64_value:
    { decimal_value | hex_value }

decimal_value:
    [-]0—9+

hex_value:
    [-]0x{0—9|a—f|A—F}+

database_id:
    {a—z}[{a—z|0—9|_|-}+]{a—z|0—9}

table_name, column_name, index_name, view_name:
    {a—z|A—Z}[{a—z|A—Z|0—9|_}+]

표기법:

  • 대괄호 '[ ]'는 절(선택사항)을 의미합니다.
  • 괄호 '( )'는 리터럴 괄호를 의미합니다.
  • 세로 막대 '|'는 논리 OR을 의미합니다.
  • 중괄호 '{ }'는 옵션 조합을 묶는 데 사용됩니다.
  • 쉼표 다음에 오는 생략 부호는 앞의 항목이 쉼표로 구분된 목록에서 반복될 수 있음을 나타냅니다. item [, ...]는 하나 이상의 항목을 나타내고 [item, ...]는 0개 이상의 항목을 나타냅니다.
  • 쉼표 ','는 리터럴 쉼표를 의미합니다.
  • 꺾쇠괄호 '<>'는 리터럴 꺾쇠괄호를 의미합니다.
  • 엠 대시 '—'는 양쪽에 있는 항목 사이의 값 범위를 의미합니다.
  • 더하기 기호 '+'는 앞의 항목이 반복될 수 있음을 의미합니다.

예약된 키워드

일부 단어는 Cloud Spanner SQL 언어에서 특별한 의미를 가지며 Cloud Spanner의 DDL에 예약되어 있습니다. 예약된 키워드를 스키마에서 식별자로 사용해야 할 경우 백틱(`)으로 묶습니다. Cloud Spanner에 예약된 키워드의 전체 목록은 어휘 구조 및 구문을 참조하세요.

예를 들면 다음과 같습니다.

CREATE TABLE MyTable (
  RowId INT64 NOT NULL,
  `Order` INT64
) PRIMARY KEY (RowId);

이름 지정 규칙

다음 규칙은 데이터베이스 ID에 적용됩니다.

  • 소문자로 시작해야 합니다.
  • 소문자, 숫자, 밑줄, 하이픈을 포함할 수 있으나 대문자는 포함할 수 없습니다.
  • 밑줄이나 하이픈으로 끝나서는 안 됩니다.
  • 예약된 단어이거나 하이픈을 포함할 경우 백틱(`)으로 묶어야 합니다.
  • 2-30자 사이여야 합니다.
  • 만든 후에는 변경할 수 없습니다.

다음 규칙이 테이블, , 색인, 보기제약조건에 적용됩니다.

  • 길이는 1자 이상이어야 합니다.

  • 최대 128자까지 포함할 수 있습니다.

  • 대문자나 소문자로 시작되어야 합니다.

  • 대문자, 소문자, 숫자, 밑줄을 포함할 수 있으나 하이픈은 포함할 수 없습니다.

  • 같은 이름으로 2개의 Cloud Spanner 객체를 만들 수 없습니다. 여기에는 대소문자만 다른 이름이 포함됩니다. 예를 들어 다음 스니펫에서 두 번째 문은 테이블 이름이 대소문자만 다르기 때문에 실패합니다.

    CREATE TABLE MyTable (col1 INT64) PRIMARY KEY (col1);
    CREATE TABLE MYTABLE (col1 INT64) PRIMARY KEY (col1);
    
  • DDL 문에서 다른 스키마 객체를 참조할 때는(예: 기본 키의 열 이름 또는 색인의 테이블 및 열 이름), 각 항목의 이름에 원래의 대소문자를 사용하는 것이 중요합니다. 예를 들어 다음 문으로 생성된 Singers 테이블을 가정해보세요.

    CREATE TABLE Singers (
      SingerId   INT64 NOT NULL,
      FirstName  STRING(1024),
      LastName   STRING(1024),
      SingerInfo BYTES(MAX),
      BirthDate  DATE,
    ) PRIMARY KEY(SingerId);
    

    다음 명령어는 Singers 테이블에 사용된 대소문자가 다르기 때문에 Table not found: singers 메시지와 함께 실패합니다.

    CREATE INDEX SingersByFirstLastName ON singers(FirstName, LastName)
    
  • Cloud Spanner 스키마 객체 이름은 SQL 쿼리에서 대소문자를 구분하지 않습니다. 예를 들어 다음 문으로 생성된 MyTable2 테이블을 가정해보세요.

    CREATE TABLE MyTable2 (col1 INT64) PRIMARY KEY (col1);
    

    다음 쿼리는 스키마 객체 이름이 쿼리에 대해 대소문자를 구분하지 않기 때문에 모두 성공합니다.

    SELECT col1 FROM MyTable2 LIMIT 1
    SELECT COL1 FROM MYTABLE2 LIMIT 1
    SELECT COL1 FROM mytable2 LIMIT 1
    INSERT INTO MYTABLE2 (col1) VALUES(1)
    

DATABASE 문

CREATE DATABASE

Cloud Spanner 데이터베이스를 만들 때는 데이터베이스의 ID를 정의하는 CREATE DATABASE 문을 제공해야 합니다.

CREATE DATABASE database_id

where database_id
    {a—z}[{a—z|0—9|_|-}+]{a—z|0—9}

매개변수

database_id

ALTER DATABASE

테이블의 정의를 변경합니다.

구문

ALTER DATABASE database_id
    action

where database_id is:
    {a—z}[{a—z|0—9|_|-}+]{a—z|0—9}

and action is:
    SET OPTIONS ( options_def [, ... ] )

and options_def is:
    { default_leader = { 'region' | null } |
      optimizer_version = { 1 ... 3 | null } |
      optimizer_statistics_package = { 'package_name' | null } |
      version_retention_period = { 'duration' | null } }

설명

ALTER DATABASE는 기존 데이터베이스의 정의를 변경합니다.

SET OPTIONS

  • 이 절을 사용하여 데이터베이스 수준의 스키마 계층에서 옵션을 설정합니다.

매개변수

database_id

  • 해당 속성을 변경하려는 데이터베이스의 이름입니다. 이름이 예약어이거나 하이픈이 포함된 경우, 백틱(`)으로 묶습니다. 데이터베이스 이름 지정 규칙에 대한 자세한 내용은 이 문서의 이름 지정 규칙을 참조하세요.

options_def

  • optimizer_version = { 1 ... 3 | null } 옵션을 사용하면 사용할 쿼리 옵티마이저 버전을 지정할 수 있습니다. 이 옵션을 null로 설정하면 기본 버전으로 설정하는 것과 동일합니다. 자세한 내용은 쿼리 옵티마이저를 참조하세요.

  • optimizer_statistics_package = { 'package_name' | null } 옵션을 사용하면 사용할 쿼리 옵티마이저 통계 패키지 이름을 지정할 수 있습니다. 기본적으로 가장 최근에 수집된 통계 패키지가 지정되지만 사용 가능한 모든 통계 패키지 버전을 지정할 수 있습니다. 이 옵션을 null로 설정하면 최신 버전으로 설정하는 것과 동일합니다. 자세한 내용은 쿼리 통계 패키지 버전 관리를 참조하세요.

  • version_retention_period = { 'duration' | null }은 Cloud Spanner가 데이터베이스에 대한 모든 버전의 데이터와 스키마를 보관하는 기간입니다. 기간은 [1h, 7d] 범위여야 하며 일, 시간, 분 또는 초 단위로 지정할 수 있습니다. 예를 들어 1d, 24h, 1440m, 86400s 값은 동일합니다. 값을 null로 설정하면 보관 기간이 기본값으로 재설정됩니다(기본값: 1시간). 이 옵션은 point-in-time recovery에 사용할 수 있습니다. 자세한 내용은 point-in-time recovery를 참조하세요.

  • default_leader = { 'region' | null }는 데이터베이스의 리더 리전을 설정합니다. 멀티 리전 구성을 사용하는 데이터베이스에만 이 매개변수를 사용할 수 있습니다. default_leadernull 또는 멀티 리전 구성의 읽기-쓰기 복제본 중 하나로 설정해야 합니다. null은 리더 리전을 데이터베이스의 멀티 리전 구성의 기본 리더 리전으로 재설정합니다. 자세한 내용은 기본 리더 리전 구성을 참조하세요.

데이터 유형

스칼라

DDL에서 스칼라 유형을 사용하는 구문은 다음과 같습니다.

{
  BOOL
  | INT64
  | FLOAT64
  | NUMERIC
  | STRING( length )
  | JSON
  | BYTES( length )
  | DATE
  | TIMESTAMP
}

length:
    { int64_value | MAX }

int64_value:
    { decimal_value | hex_value }

decimal_value:
    [-]0—9+

hex_value:
    [-]0x{0—9|a—f|A—F}+

int64_value은 -9,223,372,036,854,775,808(-263)~9,223,372,036,854,775,807(263 − 1) 사이 정수와 일치해야 합니다. 10진수 또는 16진수 표기법을 사용하여 지정할 수 있습니다. 16진수 형식은 0x 프리픽스와 x 소문자가 필요합니다.

STRING

STRING은 가변 길이 유니코드 문자열입니다. 이 문자열의 값은 유효한 유니코드 문자열이어야 합니다. 길이는 필수이며, 필드에 저장될 수 있는 유니코드 문자의 최대 수(바이트 아님)를 나타냅니다.

참고:

  • 열에 대한 쓰기는 새 값이 유효한 유니코드 문자열이 아니거나 지정된 길이를 초과하는 경우 거부됩니다.

  • length는 [1, 2621440] 범위의 정수가 될 수 있습니다.

  • 길이를 예측할 수 없거나 제약이 필요 없는 필드의 경우, 유효성 검사를 위해 length를 2621440에 해당하는 단축값 MAX로 설정해도 됩니다.

    저장된 문자열의 실제 길이만 스토리지 비용에 영향을 줍니다. MAX를 지정할 경우 추가 스토리지 용량이 사용되지 않습니다.

  • Cloud Spanner에서는 유니코드 문자열이 서버에서 수신될 때 UTF-8 인코딩 상태여야 합니다.

  • 유니코드 문자 숫자 값(엄밀히 말하면 코드 포인트. 문자를 결합한다는 점이 다름)으로 대조가 수행됩니다. ASCII 문자열의 경우 이것이 기본 정렬 순서입니다.

  • 테이블을 만든 후에 열의 길이를 줄일 수 있으나 이렇게 하려면 Cloud Spanner에서 기존 데이터가 길이 제약 범위 이내임을 확인해야 합니다.

JSON

JSON은 JSON 객체를 나타내는 가변 길이 유니코드 문자열입니다. 문자열은 서버에서 수신될 때 UTF-8 인코딩 상태여야 합니다. JSON 값의 최대 길이는 2,621,440자입니다.

자세한 내용은 JSON 작업데이터 유형을 참조하세요.

BYTES

BYTES는 가변 길이의 바이너리 문자열입니다. 길이는 필수이며, 필드에 저장될 수 있는 바이트의 최대 수를 나타냅니다.

참고:

  • 열에 대한 쓰기는 새 값이 지정된 길이를 초과하는 경우 거부됩니다.

  • length는 [1, 10485760] 범위의 정수가 될 수 있고, 유효성 검사를 위해 10485760에 해당하는 단축값 MAX가 될 수도 있습니다.

    실제 저장된 바이트만 스토리지 비용에 영향을 줍니다. MAX를 지정할 경우 추가 스토리지 용량이 사용되지 않습니다.

  • 테이블을 만든 후에 열의 길이를 줄일 수 있으나 이렇게 하려면 Cloud Spanner에서 기존 데이터가 길이 제약 범위 이내임을 확인해야 합니다.

DATE

  • 시간대와 관계없는 날짜입니다.
  • [0001-01-01, 9999-12-31] 범위가 날짜의 유효한 간격입니다. 값이 이 간격을 벗어날 경우, 날짜 열에 대한 쓰기가 거부됩니다.
  • 자세한 내용과 표준 형식은 데이터 유형을 참조하세요.

TIMESTAMP

  • 나노초 단위의 타임스탬프입니다.
  • 시간대와 관계없으며 범위는 [0001-01-01 00:00:00~10000-01-01 00:00:00)입니다.
  • 자세한 내용과 표준 형식은 데이터 유형을 참조하세요.

배열

DDL에서 ARRAY 유형을 사용하는 구문은 다음과 같습니다.

ARRAY< scalar_type >

Cloud Spanner는 스칼라 배열을 지원합니다. 배열의 1차적인 목적은 한 공간에 값 컬렉션을 효율적으로 저장하는 것입니다. 배열은 개별 요소 액세스를 제공하기 위해 만들어진 것이 아닙니다. 하나의 요소를 읽거나 쓰려면 전체 배열을 읽거나 써야 합니다.

애플리케이션이 벡터나 반복된 필드 같은 데이터 구조를 사용할 경우, Cloud Spanner 배열에서 그 상태를 쉽게 지속할 수 있습니다.

다음은 ARRAY 유형의 여러 열을 사용하는 Singers의 또 다른 정의의 예시를 보여줍니다.

CREATE TABLE Singers (
  SingerId INT64,
  FeaturedSingerIds ARRAY<INT64>,
  SongNames ARRAY<STRING(MAX)>,
) PRIMARY KEY (SingerId) ...;

참고:

  • 하위 유형이 ARRAY인 배열(중첩 배열)은 지원되지 않습니다.
  • 스칼라 값과 같은 배열은 전체 크기가 10MiB를 초과할 수 없습니다.
  • 배열을 키 열로 사용할 수 없습니다.
  • CREATE TABLE 문에서 NOT NULL 주석을 사용하여 ARRAY 유형의 열을 만들 수 있습니다.

    테이블을 만든 후에는 NOT NULL 주석을 사용하여 ARRAY 유형의 열을 추가할 수 없으며 ARRAY 유형의 기존 열에 NOT NULL 주석을 추가할 수 없습니다.

TABLE 문

CREATE TABLE

새 테이블을 정의합니다.

구문

CREATE TABLE table_name ( [
   { column_name data_type [ NOT NULL ] [AS ( expression ) STORED] [ options_def ]
   | table_constraint }
   [, ... ]
] ) PRIMARY KEY ( [column_name [ { ASC | DESC } ], ...] )
[, INTERLEAVE IN PARENT table_name [ ON DELETE { CASCADE | NO ACTION } ] ]
[, ROW DELETION POLICY ( OLDER_THAN ( timestamp_column, INTERVAL num_days DAY ) ) ]

where data_type is:
    { scalar_type | array_type }

and options_def is:
    { OPTIONS ( allow_commit_timestamp = { true | null } ) }

and table_constraint is:
    [ CONSTRAINT constraint_name ]
    { CHECK ( expression ) |
      FOREIGN KEY ( column_name [, ... ] ) REFERENCES  ref_table  ( ref_column [, ... ] ) }

설명

CREATE TABLE는 현재 데이터베이스에 새 테이블을 정의합니다.

매개변수

table_name

  • 만들려는 테이블의 이름입니다. 이름 지정 안내는 이름 지정 규칙을 참조하세요.

column_name

  • 만들려는 열의 이름입니다. 이름 지정 안내는 이름 지정 규칙을 참조하세요.

data_type

  • 스칼라 또는 배열 유형일 수 있는 열의 데이터 유형입니다.

timestamp_column

  • CREATE TABLE 문에서도 지정되는 TIMESTAMP 유형의 열 이름입니다.

num_days

  • 지정된 timestamp_column의 날짜로부터 경과된 일수이며 이후에 행이 삭제로 표시됩니다. 유효한 값은 음수가 아닌 정수입니다.

NOT NULL

  • 이 선택적인 열 표기법은 새 행을 삽입하는 모든 변형에 이 열이 필요하도록 지정합니다.

  • 기존 테이블에는 NOT NULL 열을 추가할 수 없습니다. 대부분의 열 유형에서는 이러한 제한을 해결할 수 있습니다.

    • ARRAY 유형의 열의 경우, NOT NULL 표기법을 사용할 수 있는 유일한 경우는 테이블 생성할 때입니다. 이후에는 ARRAY 유형의 열에 NOT NULL 표기법을 추가할 수 없습니다.

    • 다른 모든 열 유형의 경우 null 허용 열을 추가 할 수 있습니다. 모든 행에 값을 기록하여 해당 열을 채웁니다. 해당 열의 NOT NULL 주석으로 스키마를 업데이트합니다.

AS ( expression ) STORED

  • 이 절에서는 열을 생성 열로 만듭니다. 생성 열은 해당 값이 동일 행에 있는 다른 열의 함수로 정의되는 열입니다.

  • expression은 다음 제한 사항을 포함하여 열 데이터 유형에 할당할 수 있는 모든 유효한 SQL 표현식일 수 있습니다.

  • 표현식 다음의 STORED 속성은 함수 결과를 테이블의 다른 열과 함께 저장합니다. 이후에 참조 열을 업데이트하면 표현식이 다시 평가되고 저장됩니다.

  • STORED 속성이 없는 생성 열은 허용되지 않습니다.

  • 생성 열에 대한 직접 쓰기는 허용되지 않습니다.

  • 생성 열은 기본 키로 또는 기본 키의 일부로 사용될 수 없습니다. 하지만 보조 색인 키일 수 있습니다.

  • 생성 열 또는 생성 열에서 참조하는 열에서는 열 옵션 allow_commit_timestamp가 허용되지 않습니다.

  • 생성 열 또는 생성 열로 참조되는 열의 데이터 유형은 변경할 수 없습니다.

  • 생성 열에서 참조하는 열을 삭제할 수 없습니다.

생성 열을 사용하는 방법에 대한 예시는 생성 열 만들기 및 관리를 참조하세요.

PRIMARY KEY ( [column_name[ { ASC | DESC } ], ...]

  • 모든 테이블에는 기본 키가 있으며 이 기본 키는 해당 테이블의 0개 이상의 열로 구성될 수 있습니다.

  • 기본 키 열 이름에 DESC 주석을 추가하면 데이터의 실제 레이아웃이 오름차순(기본값)에서 내림차순으로 변경됩니다.

    자세한 내용은 스키마 및 데이터 모델을 참조하세요.

[, INTERLEAVE IN PARENTtable_name[ ON DELETE { CASCADE | NO ACTION } ] ]

  • 이 절은 하위-상위 테이블 관계를 정의하며, 결과적으로 상위 행과 하위 행이 실제로 인터리브 처리됩니다. 상위 요소 기본 키 열의 이름과 유형은 하위 요소 기본 키 열의 프리픽스와 위치상으로 일치해야 합니다. 해당 상위 행이 없으면 하위 테이블에 행을 추가할 수 없습니다. 상위 행은 이미 데이터베이스에 있거나 동일한 트랜잭션에서 하위 행을 삽입하기 전에 삽입할 수 있습니다.

  • 선택사항인 ON DELETE 절은 변형이 상위 행을 삭제하려고 시도할 때 ChildTable에 있는 행의 동작을 정의합니다. 지원되는 옵션은 다음과 같습니다.

    • CASCADE: 하위 행이 삭제됩니다.

    • NO ACTION: 하위 행이 삭제되지 않습니다. 상위 요소를 삭제하면 하위 행이 남게 되어 상위-하위 참조 무결성을 위반하므로 쓰기가 실패합니다.

    ON DELETE NO ACTION의 기본값을 사용할 경우, ON DELETE 절을 생략할 수 있습니다.

    자세한 내용은 스키마 및 데이터 모델을 참조하세요.

CONSTRAINTconstraint_name

  • 테이블 제약조건에 대한 선택적인 이름입니다. 이름이 지정되지 않았으면 Cloud Spanner가 해당 제약조건의 이름을 생성합니다. 생성된 이름을 포함한 제약조건 이름은 Cloud Spanner의 정보 스키마로부터 쿼리할 수 있습니다.

CHECK (expression)

  • CHECK 제약조건을 사용하면 하나 이상의 열 값이 부울 표현식을 충족해야 하도록 지정할 수 있습니다.

  • expressionBOOL로 평가되는 모든 유효한 SQL 표현식일 수 있습니다.

  • 다음 제약조건이 확인 제약조건 expression 항에 적용됩니다.

    • 이 표현식은 동일 테이블의 열만 참조할 수 있습니다.

    • 표현식은 직접 또는 비생성 열을 참조하는 생성 열을 통해 하나 이상의 비생성 열을 참조해야 합니다.

    • 표현식은 allow_commit_timestamp 옵션이 설정된 열을 참조할 수 없습니다.

    • 표현식은 서브 쿼리를 포함할 수 없습니다.

    • 표현식은 CURRENT_DATE()CURRENT_TIMESTAMP()와 같은 비결정적 함수를 포함할 수 없습니다.

  • 자세한 내용은 확인 제약조건 만들기 및 관리를 참조하세요.

FOREIGN KEY (column_name[, ... ] ) REFERENCESref_table(ref_column[, ... ] )

  • 이 절을 사용하여 외래 키 제약조건을 정의합니다. 외래 키는 관계의 참조 테이블에 정의되며, 참조되는 테이블을 참조합니다. 두 테이블의 외래 키 열을 참조 열 및 참조되는 열이라고 부르며, 해당 행 값이 키가 됩니다.

  • 외래 키 제약조건은 이 테이블의 하나 이상의 열에는 참조되는 테이블의 참조되는 열에만 있는 값만 포함되어야 합니다.

  • 외래 키를 만들 때는 전체 기본 키가 참조되지 않는 한 참조되는 테이블에 고유한 제약조건이 자동으로 생성됩니다. 고유한 제약조건을 충족할 수 없으면 전체 스키마 변경이 실패합니다.

  • 참조 열과 참조되는 열의 개수는 동일해야 합니다. 순서도 중요합니다. 즉, 첫 번째 참조 열은 첫 번째 참조되는 열을 참조하고, 두 번째 참조 열은 두 번째 참조되는 열을 참조해야 합니다.

  • 참조 열 및 참조되는 열에는 일치 유형이 있어야 하고 등호 연산자 ('=')를 지원해야 합니다. 또한 열은 색인화할 수 있어야 합니다. ARRAY 유형의 열은 허용되지 않습니다.

  • allow_commit_timestamp=true 옵션이 있는 열에는 외래 키를 만들 수 없습니다.

    자세한 내용은 외래 키를 참조하세요.

OPTIONS ( allow_commit_timestamp = { true | null } )

  • allow_commit_timestamp 옵션을 사용하여 삽입 및 업데이트 작업으로 트랜잭션의 커밋 타임스탬프를 열에 기록하도록 Cloud Spanner에 요청할 수 있습니다. 자세한 내용은 커밋 타임스탬프를 참조하세요.

[, ROW DELETION POLICY ( OLDER_THAN (timestamp_column, INTERVALnum_daysDAY ) ) ]

  • 이 절의 안내에 따라 이 테이블의 행 삭제 정책을 설정합니다. 자세한 내용은 TTL(수명)을 참조하세요.

ALTER TABLE

테이블의 정의를 변경합니다.

구문

ALTER TABLE table_name
    action [, ... ]

where action is:
    ADD [ COLUMN  ] column_name data_type [ NOT NULL]  [AS ( expression ) STORED] [ options_def ]
    DROP [ COLUMN ] column_name
    ADD table_constraint
    DROP CONSTRAINT constraint_name
    SET ON DELETE { CASCADE | NO ACTION }
    ALTER [ COLUMN ] column_name { { data_type } [ NOT NULL ] | SET [ options_def ] }
    ADD ROW DELETION POLICY ( OLDER_THAN ( timestamp_column, INTERVAL num_days DAY ))
    DROP ROW DELETION POLICY
    REPLACE ROW DELETION POLICY ( OLDER_THAN ( timestamp_column, INTERVAL num_days DAY ))

and data_type is:
    { scalar_type | array_type }

and options_def is:
    { OPTIONS (allow_commit_timestamp = { true | null } ) }

and table_constraint is:
    [ CONSTRAINT constraint_name ]
    { CHECK ( expression ) |
      FOREIGN KEY ( column_name [, ... ] ) REFERENCES ref_table ( ref_column [, ... ] ) }

설명

ALTER TABLE은 기존 테이블의 정의를 변경합니다.

ADD COLUMN

  • CREATE TABLE과 동일한 구문을 사용하여 새 열을 테이블에 추가합니다.

DROP COLUMN

  • 테이블에서 열을 삭제합니다.

  • 생성 열에서 참조하는 열을 삭제할 수 없습니다.

  • CHECK 제약조건으로 참조되는 열 삭제는 허용되지 않습니다.

ADDtable_constraint

  • CREATE TABLE과 동일한 구문을 사용하여 테이블에 새 제약조건을 추가합니다.

  • 외래 키의 경우 외래 키가 추가되기 전에 기존 데이터를 검사합니다. 기존 제약조건 키에 해당되는 참조되는 키가 없거나 참조되는 키가 고유하지 않으면 제약조건이 위반되고 ALTER 문이 실패합니다.

  • CHECK 제약조건의 경우 제약조건에 대해 새 데이터가 즉시 검증됩니다. 제약조건에 대해 기존 데이터를 검증하기 위해 장기 실행 프로세스도 시작됩니다. 기존 데이터가 제약조건을 준수하지 않을 경우 확인 제약조건이 롤백됩니다.

  • 다음 제약조건이 확인 제약조건 expression 항에 적용됩니다.

    • 이 표현식은 동일 테이블의 열만 참조할 수 있습니다.

    • 표현식은 직접 또는 비생성 열을 참조하는 생성 열을 통해 하나 이상의 비생성 열을 참조해야 합니다.

    • 표현식은 allow_commit_timestamp 옵션이 설정된 열을 참조할 수 없습니다.

    • 표현식은 서브 쿼리를 포함할 수 없습니다.

    • 표현식은 CURRENT_DATE()CURRENT_TIMESTAMP()와 같은 비결정적 함수를 포함할 수 없습니다.

DROP CONSTRAINTconstraint_name

  • 해당하는 경우 테이블에서 지정된 제약조건을 관련 색인과 함께 삭제합니다.

SET ON DELETE { CASCADE | NO ACTION }

  • 이 변경은 상위-하위, 인터리브 처리된 테이블 관계의 하위 테이블에만 적용될 수 있습니다. 자세한 내용은 스키마 및 데이터 모델을 참조하세요.

  • ON DELETE CASCADE 절은 상위 테이블의 행이 삭제될 때 이 테이블의 해당 하위 행도 자동으로 삭제됨을 나타냅니다. 하위 행은 동일한 기본 키로 시작하는 모든 행입니다. 그러나 하위 테이블에 이 주석이 없거나 주석이 ON DELETE NO ACTION인 경우, 하위 행을 먼저 삭제해야 상위 행을 삭제할 수 있습니다.

ALTER COLUMN

  • 테이블에서 기존 열의 정의를 변경합니다.

ADD ROW DELETION POLICY ( OLDER_THAN (timestamp_column, INTERVALnum_daysDAY ) )

  • 행을 삭제할 특정 날짜 이후로 기간을 정의하는 행 삭제 정책을 테이블에 추가합니다. TTL(수명)을 참조하세요. 테이블에서 행 삭제 정책은 한 번에 하나만 사용될 수 있습니다.

DROP ROW DELETION POLICY

  • 테이블에 있는 행 삭제 정책을 삭제합니다.

REPLACE ROW DELETION POLICY ( OLDER_THAN (timestamp_column, INTERVALnum_daysDAY ) )

  • 기존 행 삭제 정책을 새 정책으로 바꿉니다.

매개변수

table_name

  • 변경할 기존 테이블의 이름입니다.

column_name

  • 새 열 또는 기존 열의 이름입니다. 테이블의 키 열은 변경할 수 없습니다.

data_type

  • 새 열의 데이터 유형 또는 기존 열의 새 데이터 유형입니다.

  • 생성 열 또는 생성 열로 참조되는 열의 데이터 유형은 변경할 수 없습니다.

  • CHECK 제약조건에 참조되는 열에서는 데이터 유형 변경이 허용되지 않습니다. options_def

  • (allow_commit_timestamp=true) 옵션을 사용하여 삽입 및 업데이트 작업으로 트랜잭션의 커밋 타임스탬프를 열에 기록하도록 Cloud Spanner에 요청할 수 있습니다. 자세한 내용은 커밋 타임스탬프를 참조하세요.

table_constraint

  • 테이블의 새 테이블 제약조건입니다.

constraint_name

  • 새 제약조건 또는 기존 제약조건의 이름입니다.

ref_table

  • 외래 키 제약조건의 참조되는 테이블입니다.

ref_column

  • 외래 키 제약조건의 참조되는 열입니다.

DROP TABLE

테이블을 삭제합니다.

구문

DROP TABLE table_name

설명

DROP TABLE 명령문을 사용하여 데이터베이스에서 테이블을 제거합니다.

  • DROP TABLE은 복구할 수 없습니다.

  • 색인이 있거나 인터리브 처리된 테이블 또는 색인이 있는 테이블은 삭제할 수 없습니다.

  • DROP TABLE 문은 테이블의 외래 키와 외래 키 보조 인덱스를 자동으로 삭제합니다.

매개변수

table_name

  • 삭제할 테이블의 이름입니다.

INDEX 문

CREATE INDEX

보조 색인을 정의하려면 CREATE INDEX 문을 사용합니다.

구문

CREATE [ UNIQUE ] [ NULL_FILTERED ] INDEX index_name
ON table_name ( key_part [, ...] ) [ storing_clause ] [ , interleave_clause ]

where index_name is:
    {a—z|A—Z}[{a—z|A—Z|0—9|_}+]

and key_part is:
    column_name [ { ASC | DESC } ]

and storing_clause is:
    STORING ( column_name [, ...] )

and interleave_clause is:
    INTERLEAVE IN table_name

설명

Cloud Spanner는 각 테이블의 기본 키 열의 색인을 자동으로 생성합니다.

CREATE INDEX를 사용하여 다른 열의 보조 색인을 만들 수 있습니다. 열에 보조 색인을 추가하면 해당 열의 데이터를 더 효율적으로 조회할 수 있습니다. 자세한 내용은 보조 색인을 참조하세요.

매개변수

UNIQUE

  • 이 보조 색인은 색인이 생성되는 데이터에 UNIQUE 제약조건을 적용한다는 것을 의미합니다. UNIQUE 제약이 적용되면 중복 색인 키를 생성하는 모든 트랜잭션이 거부됩니다. 자세한 내용은 고유 색인을 참조하세요.

NULL_FILTERED

  • 보조 색인이 NULL 값의 색인을 생성하지 않음을 의미합니다. 자세한 내용은 NULL 값의 색인 생성을 참조하세요.

index_name

  • 만들려는 색인의 이름입니다. 이름 지정 안내는 이름 지정 규칙을 참조하세요.

table_name

  • 색인을 생성할 테이블의 이름입니다.

INTERLEAVE IN

  • 색인을 인터리브 처리할 테이블을 정의합니다. T가 색인이 인터리브 처리되는 테이블이라면,

    • T가 색인이 생성되는 테이블의 상위 요소여야 합니다.
    • T의 기본 키가 색인의 키 프리픽스여야 합니다.

    인터리브 처리된 색인은 언제 만들어야 할까요? 색인 작업에 사용하려는 색인 키가 테이블의 키와 일치하는 경우, 테이블의 행과 해당 색인이 생성되는 행 사이에 데이터 위치 관계가 설정되어야 한다면 해당 테이블에 해당 색인을 인터리브 처리하는 것이 좋습니다.

    예를 들어 Singers의 특정 행에 Songs의 모든 행에 대한 색인을 생성하려면 색인 키에 SingerIdSongName이 포함되고, 특정 가수에 대한 정보를 자주 가져오는 경우 색인에서 해당 가수의 노래를 가져오므로 색인을 Singers에서 인터리브 처리하는 것이 좋습니다. 인터리브 처리된 색인을 만드는 방법의 예시는 보조 색인 만들기에서 SongsBySingerSongName의 정의를 참조하세요.

    인터리브 처리된 색인의 항목은 인터리브 처리된 테이블과 마찬가지로 상위 테이블의 해당 행과 함께 저장됩니다. 자세한 내용은 데이터베이스 분할을 참조하세요.

DESC

  • 해당 색인 열의 내림차순 스캔 순서를 정의합니다. DESC라고 표시된 색인 열을 사용하여 테이블을 스캔할 경우, 스캔 대상 행이 이 색인 열을 기준으로 내림차순으로 표시됩니다. 정렬 순서를 지정하지 않으면 기본값은 오름차순(ASC)입니다.

STORING

  • 테이블의 데이터를 해당 테이블에 있는 1개 이상의 보조 색인으로 복제하는 메커니즘을 제공합니다. 보조 색인을 사용하여 데이터를 검색할 경우, 추가 스토리지를 사용하는 대신 읽기 지연 시간이 단축됩니다. 색인에서 원하는 항목을 찾은 후에는 기본 테이블에서 데이터를 검색할 필요가 없기 때문입니다. 이에 관한 예시는 STORING 절을 참조하세요.

DROP INDEX

보조 색인을 삭제합니다.

구문

DROP INDEX index_name

설명

보조 색인을 삭제하려면 DROP INDEX 문을 사용합니다.

매개변수

index_name

  • 삭제할 색인의 이름입니다.

STATISTICS 문

ALTER STATISTICS

쿼리 옵티마이저 통계 패키지의 정의를 변경합니다.

구문

ALTER STATISTICS package_name
    action

where package_name is:
    {a—z}[{a—z|0—9|_|-}+]{a—z|0—9}

and action is:
    SET OPTIONS ( options_def )

and options_def is:
    { allow_gc = { true | false } }

설명

ALTER STATISTICS는 쿼리 옵티마이저 통계 패키지의 정의를 변경합니다.

SET OPTIONS

  • 이 절을 사용하여 지정된 통계 패키지에 옵션을 설정합니다.

매개변수

package_name

  • 해당 속성을 변경하려는 기존 쿼리 옵티마이저 통계 패키지의 이름입니다.

    기존 통계 패키지를 가져오려면 다음 안내를 따르세요.

    SELECT s.package_name AS package_name, s.allow_gc AS allow_gc FROM INFORMATION_SCHEMA.SPANNER_STATISTICS s;

options_def

  • allow_gc = { true | false } 옵션을 사용하면 특정 통계 패키지의 가비지 콜렉션 여부를 지정할 수 있습니다. 패키지가 쿼리 힌트에 사용될 경우 패키지를 allow_gc=false로 설정해야 합니다. 자세한 내용은 통계 패키지의 가비지 컬렉션을 참조하세요.

VIEW 문

CREATE VIEW 및 CREATE OR REPLACE VIEW

CREATE VIEW 또는 CREATE OR REPLACE VIEW 문을 사용하여 를 정의합니다.

구문

{ CREATE VIEW | CREATE OR REPLACE VIEW } view_name
SQL SECURITY INVOKER
AS query

설명

CREATE VIEW는 현재 데이터베이스에 새 뷰를 정의합니다. 이름이 view_name인 뷰가 이미 있으면 CREATE VIEW 문이 실패합니다.

CREATE OR REPLACE VIEW는 현재 데이터베이스에 새 뷰를 정의합니다. 이름이 view_name인 뷰가 이미 있으면 해당 정의가 대체됩니다.

매개변수

view_name

  • 생성할 뷰의 이름입니다. 이름 지정 안내는 이름 지정 규칙을 참조하세요.

SQL SECURITY INVOKER

  • 쿼리에 뷰가 사용될 때 뷰에서 참조되는 객체는 쿼리를 호출한 사용자의 사용자 인증 정보에 대해 액세스 확인이 수행되었음을 나타냅니다. 이는 Cloud Spanner에서 유일한 SQL 보안 옵션입니다.

AS query

  • 뷰의 콘텐츠를 정의하는 쿼리입니다.

    쿼리 구성에 대한 자세한 내용은 쿼리 구문을 참조하세요.

DROP VIEW

뷰를 삭제합니다.

구문

DROP VIEW view_name

설명

DROP VIEW 명령문을 사용하여 데이터베이스에서 뷰를 제거합니다.

매개변수

view_name

  • 삭제할 뷰의 이름입니다.