CREATE TABLE(Transact-SQL)
새 테이블을 만듭니다.
구문
CREATE TABLE
[ database_name . [ schema_name ] . | schema_name . ] table_name
( { <column_definition> | <computed_column_definition>
| <column_set_definition> }
[ <table_constraint> ] [ ,...n ] )
[ ON { partition_scheme_name ( partition_column_name ) | filegroup
| "default" } ]
[ { TEXTIMAGE_ON { filegroup | "default" } ]
[ FILESTREAM_ON { partition_scheme_name | filegroup
| "default" } ]
[ WITH ( <table_option> [ ,...n ] ) ]
[ ; ]
<column_definition> ::=
column_name <data_type>
[ FILESTREAM ]
[ COLLATE collation_name ]
[ SPARSE ]
[ NULL | NOT NULL ]
[
[ CONSTRAINT constraint_name ] DEFAULT constant_expression ]
| [ IDENTITY [ ( seed ,increment ) ] [ NOT FOR REPLICATION ]
]
[ ROWGUIDCOL ] [ <column_constraint> [ ...n ] ]
<data type> ::=
[ type_schema_name . ] type_name
[ ( precision [ , scale ] | max |
[ { CONTENT | DOCUMENT } ] xml_schema_collection ) ]
<column_constraint> ::=
[ CONSTRAINT constraint_name ]
{ { PRIMARY KEY | UNIQUE }
[ CLUSTERED | NONCLUSTERED ]
[
WITH FILLFACTOR = fillfactor
| WITH ( < index_option > [ , ...n ] )
]
[ ON { partition_scheme_name ( partition_column_name )
| filegroup | "default" } ]
| [ FOREIGN KEY ]
REFERENCES [ schema_name . ] referenced_table_name [ ( ref_column ) ]
[ ON DELETE { NO ACTION | CASCADE | SET NULL | SET DEFAULT } ]
[ ON UPDATE { NO ACTION | CASCADE | SET NULL | SET DEFAULT } ]
[ NOT FOR REPLICATION ]
| CHECK [ NOT FOR REPLICATION ] ( logical_expression )
}
<computed_column_definition> ::=
column_name AS computed_column_expression
[ PERSISTED [ NOT NULL ] ]
[
[ CONSTRAINT constraint_name ]
{ PRIMARY KEY | UNIQUE }
[ CLUSTERED | NONCLUSTERED ]
[
WITH FILLFACTOR = fillfactor
| WITH ( <index_option> [ , ...n ] )
]
| [ FOREIGN KEY ]
REFERENCES referenced_table_name [ ( ref_column ) ]
[ ON DELETE { NO ACTION | CASCADE } ]
[ ON UPDATE { NO ACTION } ]
[ NOT FOR REPLICATION ]
| CHECK [ NOT FOR REPLICATION ] ( logical_expression )
[ ON { partition_scheme_name ( partition_column_name )
| filegroup | "default" } ]
]
<column_set_definition> ::=
column_set_name XML COLUMN_SET FOR ALL_SPARSE_COLUMNS
< table_constraint > ::=
[ CONSTRAINT constraint_name ]
{
{ PRIMARY KEY | UNIQUE }
[ CLUSTERED | NONCLUSTERED ]
(column [ ASC | DESC ] [ ,...n ] )
[
WITH FILLFACTOR = fillfactor
|WITH ( <index_option> [ , ...n ] )
]
[ ON { partition_scheme_name (partition_column_name)
| filegroup | "default" } ]
| FOREIGN KEY
( column [ ,...n ] )
REFERENCES referenced_table_name [ ( ref_column [ ,...n ] ) ]
[ ON DELETE { NO ACTION | CASCADE | SET NULL | SET DEFAULT } ]
[ ON UPDATE { NO ACTION | CASCADE | SET NULL | SET DEFAULT } ]
[ NOT FOR REPLICATION ]
| CHECK [ NOT FOR REPLICATION ] ( logical_expression )
}
<table_option> ::=
{
DATA_COMPRESSION = { NONE | ROW | PAGE }
[ ON PARTITIONS ( { <partition_number_expression> | <range> }
[ , ...n ] ) ]
}
<index_option> ::=
{
PAD_INDEX = { ON | OFF }
| FILLFACTOR = fillfactor
| IGNORE_DUP_KEY = { ON | OFF }
| STATISTICS_NORECOMPUTE = { ON | OFF }
| ALLOW_ROW_LOCKS = { ON | OFF}
| ALLOW_PAGE_LOCKS ={ ON | OFF}
| DATA_COMPRESSION = { NONE | ROW | PAGE }
[ ON PARTITIONS ( { <partition_number_expression> | <range> }
[ , ...n ] ) ]
}
<range> ::=
<partition_number_expression> TO <partition_number_expression>
인수
database_name
테이블이 만들어지는 데이터베이스 이름입니다. database_name에는 기존의 데이터베이스 이름을 지정해야 합니다. database_name을 지정하지 않으면 기본적으로 현재 데이터베이스가 됩니다. 현재 연결에 대한 로그인은 database_name에 지정된 데이터베이스의 기존 사용자 ID와 연결되어야 하며 해당 사용자 ID는 CREATE TABLE 권한을 갖고 있어야 합니다.schema_name
새 테이블이 속한 스키마의 이름입니다.table_name
새 테이블의 이름입니다. 테이블 이름은 식별자에 적용되는 규칙을 따라야 합니다. 로컬 임시 테이블 이름(단일 숫자 기호(#)가 접두사로 붙은 이름이며 최대 116자)을 제외하면 table_name은 최대 128자가 될 수 있습니다.column_name
테이블에 있는 열 이름입니다. 열 이름은 식별자에 적용되는 규칙을 따라야 하며 테이블에서 고유해야 합니다. column_name은 128자까지 지정할 수 있습니다. timestamp 데이터 형식으로 만든 열에서는 column_name을 생략할 수 있습니다. column_name을 지정하지 않으면 timestamp 열의 이름은 기본적으로 timestamp가 됩니다.computed_column_expression
계산 열의 값을 정의하는 식입니다. 계산 열은 해당 열에 PERSISTED 표시가 없는 한 테이블에 물리적으로 저장되지 않는 가상의 열입니다. 이 열은 같은 테이블의 다른 열을 사용하는 식에서 계산됩니다. 예를 들어 계산 열은 cost AS price * qty와 같은 정의를 가질 수 있습니다. 식은 계산되지 않은 열 이름, 상수, 함수, 변수 및 이러한 요소를 하나 이상의 연산자로 연결한 조합이 될 수 있습니다. 식은 하위 쿼리가 되거나 별칭 데이터 형식을 포함할 수 없습니다.계산 열은 SELECT 목록, WHERE 절, ORDER BY 절 또는 정규식을 사용할 수 있는 다른 위치에서 사용할 수 있습니다. 단, 다음과 같은 경우는 예외입니다.
계산 열은 DEFAULT 또는 FOREIGN KEY 제약 조건 정의로 사용하거나 NOT NULL 제약 조건 정의와 함께 사용할 수 없습니다. 그러나 계산 열 값이 결정적 식에 의해 정의되고 결과의 데이터 형식이 인덱스 열에 허용되는 경우에는 계산 열을 인덱스의 키 열이나 PRIMARY KEY 또는 UNIQUE 제약 조건의 일부로 사용할 수 있습니다.
예를 들어 테이블에 a와 b라는 정수 열이 있을 때 계산 열 a+b는 인덱싱할 수 있지만 계산 열 **a+DATEPART(dd, GETDATE())**는 다음 호출 시 값이 바뀌므로 인덱싱할 수 없습니다.
계산 열은 INSERT 또는 UPDATE 문의 대상이 될 수 없습니다.
[!참고]
테이블의 각 행은 계산 열과 연관된 열에 대해 다른 값을 가질 수 있습니다. 따라서 계산 열은 각 행에 대해 동일한 값을 갖지 않습니다.
계산 열의 Null 허용 여부는 사용되는 식을 바탕으로 데이터베이스 엔진에서 자동으로 결정합니다. 대부분 식의 결과는 언더플로 또는 오버플로에 의한 Null 결과를 생성할 수 있으므로 Null이 허용되지 않는 열만 사용하더라도 결국 식은 Null을 허용하는 것으로 간주됩니다. AllowsNull 속성과 함께 COLUMNPROPERTY 함수를 사용하여 테이블에 있는 계산 열의 Null 허용 여부를 확인합니다. Null을 허용하는 식은 check_expression 상수로 ISNULL을 지정하여 Null을 허용하지 않는 식으로 바꿀 수 있습니다. 이때 이 상수는 NULL 결과를 대체하는 Null이 아닌 값입니다. CLR(공용 언어 런타임) 사용자 정의 형식의 식을 바탕으로 한 계산 열에는 해당 형식에 대한 REFERENCES 권한이 필요합니다.
PERSISTED
SQL Server 데이터베이스 엔진이 계산된 값을 테이블에 물리적으로 저장하고 계산 열이 사용하는 다른 열이 업데이트되면 해당 값을 업데이트하도록 지정합니다. 계산 열을 PERSISTED로 표시하면 결정적이지만 정확하지는 않은 계산 열에 인덱스를 만들 수 있습니다. 자세한 내용은 계산 열에 인덱스 만들기를 참조하십시오. 분할된 테이블의 분할 열로 사용되는 계산 열은 명시적으로 PERSISTED로 표시해야 합니다. PERSISTED를 지정할 때 computed_column_expression은 결정적이어야 합니다.ON { <partition_scheme> | filegroup | "default" }
테이블이 저장된 파티션 구성표 또는 파일 그룹을 지정합니다. <partition_scheme>을 지정하면 해당 테이블은 <partition_scheme>에 지정된 하나 이상의 파일 그룹 집합에 파티션이 저장되는 분할된 테이블이 됩니다. filegroup을 지정한 경우에는 테이블이 명명된 파일 그룹에 저장됩니다. 파일 그룹은 데이터베이스 내에 있어야 합니다. **"default"**를 지정하거나 ON을 전혀 지정하지 않으면 기본 파일 그룹에 테이블이 저장됩니다. CREATE TABLE에 지정된 테이블의 저장 메커니즘은 곧이어 변경할 수 없습니다.ON {<partition_scheme> | filegroup | "default"}는 PRIMARY KEY나 UNIQUE 제약 조건에도 지정할 수 있습니다. 이러한 제약 조건은 인덱스를 만듭니다. filegroup을 지정한 경우에는 인덱스가 명명된 파일 그룹에 저장됩니다. **"default"**를 지정하거나 ON을 전혀 지정하지 않으면 테이블과 같은 파일 그룹에 인덱스가 저장됩니다. PRIMARY KEY 또는 UNIQUE 제약 조건이 클러스터형 인덱스를 만드는 경우에는 테이블에 대한 데이터 페이지가 인덱스와 동일한 파일 그룹에 저장됩니다. CLUSTERED를 지정하거나 아니면 제약 조건이 클러스터형 인덱스를 만들고 테이블 정의의 <partition_scheme> 또는 filegroup과는 다르게 <partition_scheme>을 지정하거나 그 반대인 경우에는 제약 조건 정의만 유지하고 나머지는 무시합니다.
[!참고]
여기서 말하는 default는 키워드가 아니라 기본 파일 그룹에 대한 식별자이므로 ON "default" 또는 ON [default]와 같이 구분되어야 합니다. "default"를 지정하면 현재 세션에 대해 QUOTED_IDENTIFIER 옵션이 ON이어야 합니다. 이 값은 기본 설정입니다. 자세한 내용은 SET QUOTED_IDENTIFIER(Transact-SQL)를 참조하십시오.
[!참고]
분할된 테이블을 만든 후에는 테이블의 LOCK_ESCALATION 옵션을 AUTO로 설정하십시오. 이렇게 하면 테이블 수준이 아닌 파티션(HoBT) 수준으로 잠금이 에스컬레이션되도록 하여 동시성을 향상시킬 수 있습니다. 자세한 내용은 ALTER TABLE(Transact-SQL)을 참조하십시오.
TEXTIMAGE_ON { filegroup| "default" }
지정된 파일 그룹에 text, ntext, image, xml, varchar(max), nvarchar(max), varbinary(max) 및 CLR 사용자 정의 형식 열이 저장되어 있음을 나타내는 키워드입니다.테이블에 큰 값 열이 없는 경우에는 TEXTIMAGE_ON이 허용되지 않습니다. <partition_scheme>을 지정하면 TEXTIMAGE_ON을 지정할 수 없습니다. **"default"**를 지정하거나 TEXTIMAGE_ON을 전혀 지정하지 않으면 큰 값 열이 기본 파일 그룹에 저장됩니다. CREATE TABLE에 지정된 큰 값 열 데이터를 저장한 후에는 변경할 수 없습니다.
[!참고]
여기서 말하는 default는 키워드가 아니라 기본 파일 그룹에 대한 식별자이므로 TEXTIMAGE_ON "default" 또는 TEXTIMAGE_ON [default]와 같이 구분되어야 합니다. "default"를 지정하면 현재 세션에 대해 QUOTED_IDENTIFIER 옵션이 ON이어야 합니다. 이 값은 기본 설정입니다. 자세한 내용은 SET QUOTED_IDENTIFIER(Transact-SQL)를 참조하십시오.
FILESTREAM_ON { partition_scheme_name | filegroup | "default" }
FILESTREAM 데이터의 파일 그룹을 지정합니다.테이블에 FILESTREAM 데이터가 포함되어 있고 테이블이 분할된 경우에는 FILESTREAM_ON 절을 포함해야 하며 이 절에서 FILESTREAM 파일 그룹의 파티션 구성표를 지정해야 합니다. 이 파티션 구성표는 테이블의 파티션 구성표와 같은 파티션 함수 및 파티션 열을 사용해야 합니다. 그렇지 않으면 오류가 발생합니다.
테이블이 분할되지 않은 경우에는 FILESTREAM 열을 분할할 수 없습니다. 테이블의 FILESTREAM 데이터는 단일 파일 그룹에 저장되어야 합니다. 이 파일 그룹은 FILESTREAM_ON 절에 지정됩니다.
테이블이 분할되지 않고 FILESTREAM_ON 절이 지정되지 않은 경우에는 DEFAULT 속성이 설정된 FILESTREAM 파일 그룹이 사용됩니다. FILESTREAM 파일 그룹이 없으면 오류가 발생합니다.
ON 및 TEXTIMAGE_ON과 마찬가지로 FILESTREAM_ON에 대해 CREATE TABLE을 사용하여 설정한 값은 다음과 같은 경우를 제외하고 변경할 수 없습니다.
CREATE INDEX 문이 힙을 클러스터형 인덱스로 변환하는 경우. 이 경우 다른 FILESTREAM 파일 그룹, 파티션 구성표 또는 NULL을 지정할 수 있습니다.
DROP INDEX 문이 클러스터형 인덱스를 힙으로 변환하는 경우. 이 경우 다른 FILESTREAM 파일 그룹, 파티션 구성표 또는 **"default"**를 지정할 수 있습니다.
FILESTREAM_ON <filegroup> 절에 지정된 파일 그룹이나 파티션 구성표에 명명되어 있는 각 FILESTREAM 파일 그룹에는 파일 그룹에 대해 정의된 파일이 하나 포함되어 있어야 합니다. 이 파일은 CREATE DATABASE 또는 ALTER DATABASE 문을 사용하여 정의해야 합니다. 그렇지 않으면 오류가 발생합니다.
관련 FILESTREAM 항목은 FILESTREAM 저장소 디자인 및 구현을 참조하십시오.
[ type_schema_name**.** ] type_name
열의 데이터 형식과 열이 속한 스키마를 지정합니다. 데이터 형식은 다음 중 하나일 수 있습니다.시스템 데이터 형식
SQL Server 시스템 데이터 형식을 기반으로 하는 별칭 형식. 별칭 데이터 형식은 CREATE TYPE 문으로 만들어진 다음 테이블 정의에 사용됩니다. 별칭 데이터 형식에 대한 NULL 또는 NOT NULL 할당은 CREATE TABLE 문 중에서 덮어쓸 수 있지만 길이 지정은 변경할 수 없습니다. 즉, CREATE TABLE 문에서 별칭 데이터 형식의 길이를 지정할 수 없습니다.
CLR 사용자 정의 형식. CLR 사용자 정의 데이터 형식은 CREATE TYPE 문으로 만들어진 다음 테이블 정의에서 사용됩니다. CLR 사용자 정의 형식으로 열을 만들려면 해당 형식에 대한 REFERENCES 권한이 필요합니다.
type_schema_name을 지정하지 않으면 SQL Server 데이터베이스 엔진에서는 다음 순서로 type_name을 참조합니다.
SQL Server 시스템 데이터 형식
현재 데이터베이스에 있는 현재 사용자의 기본 스키마
현재 데이터베이스의 dbo 스키마
precision
지정한 데이터 형식의 전체 자릿수입니다. 유효한 전체 자릿수 값에 대한 자세한 내용은 전체 자릿수, 소수 자릿수 및 길이(Transact-SQL)를 참조하십시오.scale
지정한 데이터 형식에 대한 소수 자릿수입니다. 유효한 소수 자릿수 값에 대한 자세한 내용은 전체 자릿수, 소수 자릿수 및 길이를 참조하십시오.max
2^31바이트의 문자와 binary 데이터 그리고 2^30바이트의 유니코드 데이터를 저장하기 위한 varchar, nvarchar 및 varbinary 데이터 형식에만 적용됩니다.CONTENT
column_name에 있는 xml 데이터 형식의 각 인스턴스가 여러 개의 최상위 요소를 포함할 수 있도록 지정합니다. CONTENT는 xml 데이터 형식에만 적용되며 xml_schema_collection을 지정한 경우에만 지정할 수 있습니다. 지정하지 않은 경우에는 CONTENT가 기본 동작입니다.DOCUMENT
column_name에 있는 xml 데이터 형식의 각 인스턴스가 최상위 요소를 하나만 포함할 수 있도록 지정합니다. DOCUMENT는 xml 데이터 형식에만 적용되며 xml_schema_collection을 지정한 경우에만 지정할 수 있습니다.xml_schema_collection
XML 스키마 컬렉션과의 연결을 위해 xml 데이터 형식에만 적용됩니다. 스키마에 xml 열을 입력하기 전에 먼저 CREATE XML SCHEMA COLLECTION을 사용하여 데이터베이스에서 해당 스키마를 만들어야 합니다.DEFAULT
삽입 중에 값이 명시적으로 지정되지 않은 경우에 열에 대해 제공되는 값을 지정합니다. DEFAULT 정의는 timestamp로 정의되거나 IDENTITY 속성이 있는 열을 제외한 모든 열에 적용할 수 있습니다. 사용자 정의 형식 열에 대해 기본값을 지정할 경우 constant_expression에서 해당 사용자 정의 형식으로 암시적으로 변환할 수 있어야 합니다. DEFAULT 정의는 테이블이 삭제될 때 제거됩니다. 문자열과 같은 상수 값, 스칼라 함수(시스템 함수, 사용자 정의 함수 또는 CLR 함수) 또는 NULL만 기본값으로 사용할 수 있습니다. 이전 버전의 SQL Server와 호환성을 유지하기 위해 DEFAULT에 제약 조건 이름을 할당할 수 있습니다.constant_expression
열의 기본값으로 사용되는 상수, NULL 또는 시스템 함수입니다.IDENTITY
새 열이 ID 열임을 나타냅니다. 테이블에 새 행이 추가되면 데이터베이스 엔진은 열에 대해 고유한 증가값을 제공합니다. ID 열은 일반적으로 PRIMARY KEY 제약 조건과 함께 사용되어 테이블에 대한 고유한 행 식별자 역할을 합니다. tinyint, smallint, int, bigint, decimal(p,0) 또는 numeric(p,0) 열에 IDENTITY 속성을 할당할 수 있습니다. ID 열은 테이블당 하나만 만들 수 있습니다. ID 열에는 바인딩된 기본값 및 DEFAULT 제약 조건을 사용할 수 없습니다. 초기값과 증가값은 둘 다 지정하거나 또는 둘 다 지정하지 않아야 합니다. 둘 다 지정하지 않은 경우에는 기본값(1,1)이 사용됩니다.seed
테이블에 로드되는 첫 번째 행에 사용하는 값입니다.increment
로드된 이전 행의 ID 값에 추가되는 증가값입니다.NOT FOR REPLICATION
CREATE TABLE 문에서 IDENTITY 속성, FOREIGN KEY 제약 조건 및 CHECK 제한 조건에 대해 NOT FOR REPLICATION 절을 지정할 수 있습니다. IDENTITY 속성에 이 절을 지정하면 복제 에이전트가 삽입 작업을 수행할 때 ID 열의 값이 증가하지 않습니다. 제약 조건에 대해 이 절을 지정하면 복제 에이전트가 삽입, 업데이트 또는 삭제 작업을 수행할 때 해당 제약 조건이 강제로 적용되지 않습니다. 자세한 내용은 NOT FOR REPLICATION으로 제약 조건, ID 및 트리거 제어를 참조하십시오.ROWGUIDCOL
새 열이 행 GUID 열임을 나타냅니다. 테이블당 한 개의 uniqueidentifier 열만 ROWGUIDCOL 열로 지정할 수 있으며 ROWGUIDCOL 속성을 적용하면 $ROWGUID를 사용하여 열을 참조할 수 있습니다. ROWGUIDCOL 속성은 uniqueidentifier 열에만 할당할 수 있습니다. 데이터베이스 호환성 수준이 65 이하인 경우에는 ROWGUIDCOL 키워드가 유효하지 않습니다. 자세한 내용은 sp_dbcmptlevel(Transact-SQL)을 참조하십시오. 사용자 정의 데이터 형식 열은 ROWGUIDCOL로 지정할 수 없습니다.ROWGUIDCOL 속성은 열에 저장된 값이 고유하도록 강제 적용하지 않습니다. ROWGUIDCOL은 테이블에 삽입된 새 행에 대한 값을 자동으로 생성하지도 않습니다. 각 열에 고유한 값을 생성하려면 INSERT 문에 NEWID 또는 NEWSEQUENTIALID 함수를 사용하거나 열에 대한 기본값으로 이러한 함수를 사용하십시오.
SPARSE
열이 스파스 열임을 나타냅니다. 스파스 열의 저장은 Null 값에 대해 최적화됩니다. 스파스 열은 NOT NULL로 지정할 수 없습니다. 추가 제한 사항 및 스파스 열에 대한 자세한 내용은 스파스 열 사용을 참조하십시오.FILESTREAM
varbinary(max) 열에 대해서만 사용할 수 있습니다. varbinary(max) BLOB 데이터에 대한 FILESTREAM 저장소를 지정합니다.테이블에는 ROWGUIDCOL 특성을 갖는 uniqueidentifier 데이터 형식의 열도 있어야 합니다. 이 열은 Null 값을 허용하지 않으며 UNIQUE 또는 PRIMARY KEY 단일 열 제약 조건을 가져야 합니다. 열의 GUID 값은 응용 프로그램에서 데이터를 삽입할 때 제공하거나 NEWID () 함수를 사용하는 DEFAULT 제약 조건을 통해 제공해야 합니다.
테이블에 대해 정의된 FILESTREAM 열이 있는 동안에는 ROWGUIDCOL 열을 삭제하고 관련 제약 조건을 변경할 수 없습니다. ROWGUIDCOL 열은 마지막 FILESTREAM 열이 삭제된 이후에만 삭제될 수 있습니다.
열에 대해 FILESTREAM 저장소 특성이 지정된 경우 해당 열의 모든 값이 파일 시스템에 있는 FILESTREAM 데이터 컨테이너에 저장됩니다.
COLLATE collation_name
열에 대한 데이터 정렬을 지정합니다. 데이터 정렬 이름은 Windows 데이터 정렬 이름이나 SQL 데이터 정렬 이름이 될 수 있습니다. collation_name은 char, varchar, text, nchar, nvarchar 및 ntext 데이터 형식의 열에만 적용할 수 있습니다. 지정하지 않은 경우 열이 사용자 정의 데이터 형식이면 사용자 정의 데이터 형식의 데이터 정렬에 열이 할당되고 그렇지 않은 경우에는 데이터베이스의 기본 데이터 정렬에 할당됩니다.Windows 및 SQL 데이터 정렬 이름에 대한 자세한 내용은 Windows 데이터 정렬 이름과 SQL 데이터 정렬 이름을 참조하십시오.
COLLATE 절에 대한 자세한 내용은 COLLATE(Transact-SQL)를 참조하십시오.
CONSTRAINT
PRIMARY KEY, NOT NULL, UNIQUE, FOREIGN KEY 또는 CHECK 제약 조건 정의의 시작을 표시하는 선택적인 키워드입니다. 자세한 내용은 제약 조건을 참조하십시오.constraint_name
제약 조건의 이름입니다. 제약 조건 이름은 테이블이 속한 스키마 내에서 고유한 이름이어야 합니다.NULL | NOT NULL
열의 Null 값 허용 여부를 결정합니다. NULL은 엄격하게 말해 제약 조건이 아니지만 NOT NULL처럼 지정할 수 있습니다. 계산 열에서는 PERSISTED를 지정한 경우에만 NOT NULL을 지정할 수 있습니다.PRIMARY KEY
지정한 열에 고유 인덱스를 통해 엔터티 무결성을 적용하는 제약 조건입니다. PRIMARY KEY 제약 조건은 각 테이블마다 하나만 만들 수 있습니다.UNIQUE
지정한 열에 대해 고유 인덱스를 통해 엔터티 무결성을 적용하는 제약 조건입니다. 하나의 테이블이 여러 개의 UNIQUE 제약 조건을 가질 수 있습니다.CLUSTERED | NONCLUSTERED
PRIMARY KEY 또는 UNIQUE 제약 조건에 대해 클러스터형 또는 비클러스터형 인덱스를 만들도록 지정합니다. PRIMARY KEY 제약 조건의 기본값은 CLUSTERED이며 UNIQUE 제약 조건의 기본값은 NONCLUSTERED입니다.CREATE TABLE 문에서는 한 가지 제약 조건에만 CLUSTERED를 지정할 수 있습니다. UNIQUE 제약 조건에 대해 CLUSTERED를 지정하고 PRIMARY KEY 제약 조건도 지정한 경우 PRIMARY KEY의 기본값은 NONCLUSTERED입니다.
FOREIGN KEY REFERENCES
열에 있는 데이터에 대한 참조 무결성을 제공하는 제약 조건입니다. FOREIGN KEY 제약 조건을 지정하려면 열의 각 값이 참조된 테이블의 해당하는 참조된 열에 있어야 합니다. FOREIGN KEY 제약 조건은 참조되는 테이블의 PRIMARY KEY 또는 UNIQUE 제약 조건 열이나 참조되는 테이블의 UNIQUE INDEX에서 참조되는 열만 참조할 수 있습니다. 계산 열의 외래 키 또한 PERSISTED로 표시되어야 합니다.[ schema_name**.**] referenced_table_name]
FOREIGN KEY 제약 조건이 참조하는 테이블과 그 테이블이 속한 스키마의 이름입니다.**(**ref_column [ ,... n ] )
FOREIGN KEY 제약 조건이 참조하는 테이블의 열 또는 열 목록입니다.ON DELETE { NO ACTION | CASCADE | SET NULL | SET DEFAULT }
행이 참조 관계를 가지고 참조된 행이 부모 테이블에서 삭제될 경우에 테이블의 행에 수행될 동작을 지정합니다. 기본값은 NO ACTION입니다.NO ACTION
데이터베이스 엔진에서 오류가 발생하며 부모 테이블의 행에 대한 삭제 동작이 롤백됩니다.CASCADE
부모 테이블에서 행을 삭제한 경우 참조 테이블에서도 해당 행이 삭제됩니다.SET NULL
부모 테이블의 해당 행이 삭제되면 외래 키를 구성하는 모든 값이 NULL로 설정됩니다. 이 제약 조건을 실행하려면 외래 키 열이 Null을 허용해야 합니다.SET DEFAULT
부모 테이블의 해당 행이 삭제되면 외래 키를 구성하는 모든 값이 기본값으로 설정됩니다. 이 제약 조건을 실행하려면 모든 외래 키 열에 기본 정의가 있어야 합니다. 열이 Null을 허용하고 명시적 기본값이 설정되어 있지 않은 경우 NULL은 해당 열의 암시적 기본값이 됩니다.
논리적 레코드를 사용하는 병합 게시에 테이블이 포함되는 경우 CASCADE를 지정하지 마십시오. 논리적 레코드에 대한 자세한 내용은 논리적 레코드를 사용하여 관련된 행의 변경 내용을 그룹화를 참조하십시오.
변경 중인 테이블에 INSTEAD OF 트리거 ON DELETE가 이미 있으면 ON DELETE CASCADE를 정의할 수 없습니다.
예를 들어 AdventureWorks 데이터베이스에서 ProductVendor 테이블은 Vendor 테이블과 참조 관계를 갖습니다. ProductVendor.VendorID 외래 키는 Vendor.VendorID 기본 키를 참조합니다.
Vendor 테이블의 행에 대해 DELETE 문을 실행하고 ProductVendor.VendorID에 대해 ON DELETE CASCADE 동작을 지정하면 데이터베이스 엔진은 ProductVendor 테이블에서 하나 이상의 종속 행이 있는지 확인합니다. ProductVendor 테이블에 종속 행이 있는 경우 삭제되며 Vendor 테이블에서 참조된 행도 삭제됩니다.
반대로 NO ACTION을 지정한 경우 ProductVendor 테이블에 Vendor 행을 참조하는 행이 하나 이상 있으면 데이터베이스 엔진에서 오류가 발생하고 Vendor 행의 삭제 동작이 롤백됩니다.
ON UPDATE { NO ACTION | CASCADE | SET NULL | SET DEFAULT }
변경된 테이블의 행에 참조 관계가 있고 참조된 행이 부모 테이블에서 업데이트될 경우 해당 행에 대해 발생할 동작을 지정합니다. 기본값은 NO ACTION입니다.NO ACTION
데이터베이스 엔진에서 오류가 발생하며 부모 테이블의 행에 대한 업데이트 동작이 롤백됩니다.CASCADE
부모 테이블에서 행을 업데이트하면 참조 테이블에서도 해당 행이 업데이트됩니다.SET NULL
부모 테이블의 해당 행이 업데이트되면 외래 키를 구성하는 모든 값이 NULL로 설정됩니다. 이 제약 조건을 실행하려면 외래 키 열이 Null을 허용해야 합니다.SET DEFAULT
부모 테이블의 해당 행이 업데이트되면 외래 키를 구성하는 모든 값이 기본값으로 설정됩니다. 이 제약 조건을 실행하려면 모든 외래 키 열에 기본 정의가 있어야 합니다. 열이 Null을 허용하고 명시적 기본값이 설정되어 있지 않은 경우 NULL은 해당 열의 암시적 기본값이 됩니다.
논리적 레코드를 사용하는 병합 게시에 테이블이 포함되는 경우 CASCADE를 지정하지 마십시오. 논리적 레코드에 대한 자세한 내용은 논리적 레코드를 사용하여 관련된 행의 변경 내용을 그룹화를 참조하십시오.
변경 중인 테이블에 INSTEAD OF 트리거 ON UPDATE가 이미 있으면 ON UPDATE CASCADE를 정의할 수 없습니다.
예를 들어 AdventureWorks 데이터베이스에서 ProductVendor 테이블은 Vendor 테이블과 참조 관계를 갖습니다. ProductVendor.VendorID 외래 키는 Vendor.VendorID 기본 키를 참조합니다.
Vendor 테이블의 행에 대해 UPDATE 문을 실행하고 ProductVendor.VendorID에 대해 ON UPDATE CASCADE 동작을 지정하면 데이터베이스 엔진은 ProductVendor 테이블에 하나 이상의 종속 행이 있는지 확인합니다. ProductVendor 테이블에 종속 행이 있는 경우 업데이트되며 Vendor 테이블에서 참조된 행도 업데이트됩니다.
반대로 NO ACTION을 지정한 경우 ProductVendor 테이블에 Vendor 행을 참조하는 행이 하나 이상 있으면 데이터베이스 엔진에서 오류가 발생하고 Vendor 행의 업데이트 동작이 롤백됩니다.
CHECK
열에 입력할 수 있는 가능한 값을 제한하여 도메인 무결성을 적용하는 제약 조건입니다. 계산 열의 CHECK 제약 조건 또한 PERSISTED로 표시되어야 합니다.logical_expression
TRUE 또는 FALSE를 반환하는 논리 식입니다. 별칭 데이터 형식은 식에 포함될 수 없습니다.column
제약 조건 정의에서 사용하는 열을 표시하기 위해 테이블 제약 조건에서 괄호로 묶어 사용하는 열 또는 열 목록입니다.[ ASC | DESC ]
테이블 제약 조건에 사용되는 열의 정렬 순서를 지정합니다. 기본값은 ASC입니다.partition_scheme_name
분할된 테이블의 파티션이 매핑될 파일 그룹을 정의하는 파티션 구성표의 이름입니다. 파티션 구성표는 데이터베이스 내에 있어야 합니다.[ partition_column_name**.** ]
분할된 테이블이 분할될 열을 지정합니다. 파티션 함수가 지정한 열은 partition_scheme_name이 사용하는 열과 데이터 형식, 길이, 전체 자릿수 측면에서 일치해야 합니다. 파티션 함수에 참여하는 계산 열은 명시적으로 PERSISTED로 표시되어야 합니다.중요 분할된 테이블 및 ALTER TABLE...SWITCH 작업의 원본이나 대상인 분할되지 않은 테이블의 분할 열에 NOT NULL을 지정하는 것이 좋습니다. 이렇게 하면 분할 열의 CHECK 제약 조건에서 Null 값을 확인하지 않아도 됩니다. 자세한 내용은 파티션 전환을 사용하여 데이터를 효율적으로 전송을 참조하십시오.
WITH FILLFACTOR **=**fillfactor
데이터베이스 엔진이 인덱스 데이터를 저장하는 데 사용되는 각 인덱스 페이지를 어느 정도까지 채울지 지정합니다. 사용자 지정 fillfactor 값은 1에서 100 사이일 수 있습니다. 값을 지정하지 않으면 기본값 0이 사용됩니다. 채우기 비율 값 0과 100은 모든 면에서 동일합니다.중요 현재 WITH FILLFACTOR = fillfactor가 PRIMARY KEY 또는 UNIQUE 제약 조건에 적용되는 유일한 인덱스 옵션으로 기술되어 있는 것은 이전 버전과의 호환성을 위한 것이며 이후 릴리스에서는 수록되지 않을 것입니다.
column_set_name XML COLUMN_SET FOR ALL_SPARSE_COLUMNS
열 집합의 이름입니다. 열 집합은 구조화된 출력으로 테이블의 모든 스파스 열을 결합하는 형식화되지 않은 XML 표현입니다. 열 집합에 대한 자세한 내용은 열 집합 사용을 참조하십시오.< table_option> ::=
하나 이상의 테이블 옵션을 지정합니다.DATA_COMPRESSION
지정된 테이블, 파티션 번호 또는 파티션 범위에 대한 데이터 압축 옵션을 지정합니다. 다음과 같은 옵션이 있습니다.NONE
테이블 또는 지정된 파티션이 압축되지 않습니다.ROW
테이블 또는 지정된 파티션이 행 압축을 사용하여 압축됩니다.PAGE
테이블 또는 지정된 파티션이 페이지 압축을 사용하여 압축됩니다.
압축에 대한 자세한 내용은 압축된 테이블 및 인덱스 만들기를 참조하십시오.
ON PARTITIONS ( { <partition_number_expression> | <range> } [ ,...n ] )
DATA_COMPRESSION 설정을 적용할 파티션을 지정합니다. 테이블이 분할되지 않은 경우 ON PARTITIONS 인수를 사용하면 오류가 발생합니다. ON PARTITIONS 절을 지정하지 않으면 DATA_COMPRESSION 옵션이 분할된 테이블의 모든 파티션에 적용됩니다.<partition_number_expression>은 다음과 같은 방법으로 지정할 수 있습니다.
파티션의 파티션 번호를 지정합니다(예: ON PARTITIONS (2)).
여러 개별 파티션의 파티션 번호를 쉼표로 구분하여 지정합니다(예: ON PARTITIONS (1, 5)).
범위와 개별 파티션을 모두 지정합니다(예: ON PARTITIONS (2, 4, 6 TO 8)).
<range>는 TO로 구분된 파티션 번호로 지정할 수 있습니다(예: ON PARTITIONS (6 TO 8)).
여러 파티션에 대해 서로 다른 데이터 압축 유형을 설정하려면 DATA_COMPRESSION 옵션을 두 번 이상 지정합니다. 예를 들면 다음과 같습니다.
WITH ( DATA_COMPRESSION = NONE ON PARTITIONS (1), DATA_COMPRESSION = ROW ON PARTITIONS (2, 4, 6 TO 8), DATA_COMPRESSION = PAGE ON PARTITIONS (3, 5) )
<index_option> ::=
하나 이상의 인덱스 옵션을 지정합니다. 이러한 옵션에 대한 자세한 내용은 CREATE INDEX(Transact-SQL)를 참조하십시오.PAD_INDEX = { ON | OFF }
ON이면 FILLFACTOR로 지정한 사용 가능한 공간의 비율을 인덱스의 중간 수준 페이지에 적용합니다. OFF이거나 FILLFACTOR 값을 지정하지 않으면 중간 페이지의 키 집합을 고려하여 인덱스가 가질 수 있는 최대 크기의 행을 최소한 하나만큼 저장할 공간을 남기고 용량 한계에 가깝게 중간 수준 페이지를 채웁니다. 기본값은 OFF입니다.FILLFACTOR **=**fillfactor
인덱스를 만들거나 변경할 때 데이터베이스 엔진이 각 인덱스 페이지의 리프 수준을 채우는 비율을 지정합니다. fillfactor는 1에서 100 사이의 정수 값이어야 하며 기본값은 0입니다. 채우기 비율 값 0과 100은 모든 면에서 동일합니다.IGNORE_DUP_KEY = { ON | OFF }
삽입 작업에서 고유 인덱스에 중복된 키 값을 삽입하려는 경우에 대한 오류 응답을 지정합니다. IGNORE_DUP_KEY 옵션은 인덱스를 만들거나 다시 작성한 후의 삽입 작업에만 적용됩니다. CREATE INDEX, ALTER INDEX 또는 UPDATE를 실행하는 경우에는 이 옵션이 아무런 영향을 미치지 않습니다. 기본값은 OFF입니다.ON
중복된 키 값이 고유 인덱스에 삽입되는 경우 경고 메시지가 나타나고 고유성 제약 조건을 위반하는 행만 실패합니다.OFF
중복된 키 값이 고유 인덱스에 삽입되는 경우 오류 메시지가 나타나고 전체 INSERT 작업이 롤백됩니다.
뷰, 고유하지 않은 인덱스, XML 인덱스, 공간 인덱스 및 필터링된 인덱스에 생성된 인덱스의 경우 IGNORE_DUP_KEY를 ON으로 설정할 수 없습니다.
IGNORE_DUP_KEY를 보려면 sys.indexes를 사용하십시오.
이전 버전과 호환되는 구문에서 WITH IGNORE_DUP_KEY는 WITH IGNORE_DUP_KEY = ON과 같습니다.
STATISTICS_NORECOMPUTE = { ON | OFF }
ON이면 오래된 인덱스 통계를 자동으로 다시 계산하지 않습니다. OFF이면 자동 통계 업데이트가 사용됩니다. 기본값은 OFF입니다.ALLOW_ROW_LOCKS = { ON | OFF }
ON이면 인덱스에 액세스할 때 행 잠금이 허용됩니다. 행 잠금을 사용하는 시점은 데이터베이스 엔진이 결정합니다. OFF이면 행 잠금을 사용하지 않습니다. 기본값은 ON입니다.ALLOW_PAGE_LOCKS = { ON | OFF }
ON이면 인덱스에 액세스할 때 페이지 잠금이 허용됩니다. 페이지 잠금을 사용하는 시점은 데이터베이스 엔진이 결정합니다. OFF이면 페이지 잠금을 사용하지 않습니다. 기본값은 ON입니다.
주의
SQL Server 2008에서는 데이터베이스마다 20억 개의 테이블이 있을 수 있습니다. 정의된 열 집합을 포함하는 한 테이블은 최대 30,000개의 열을 포함할 수 있으며 이 중 스파스나 계산 열로 지정되지 않은 열은 최대 1,024개까지 포함할 수 있습니다. 열 집합을 포함하지 않는 테이블은 1024개의 열로 제한됩니다. 행 개수 및 테이블의 전체 크기를 제한하는 것은 저장소의 크기뿐입니다. 행당 최대 바이트 수는 8,060이지만 정의된 총 테이블 너비가 8,060바이트를 초과하게 만드는 varchar, nvarchar, varbinary 또는 sql_variant 열이 있는 테이블의 경우 이러한 제한이 완화됩니다. 각 열의 길이는 여전히 8,000바이트 한계 내로 제한해야 하지만 이를 결합한 폭은 한 테이블에서 8,060바이트를 넘을 수 있습니다. 자세한 내용은 8KB를 초과하는 행 오버플로 데이터를 참조하십시오.
각 테이블은 최대 999개의 비클러스터형 인덱스와 1개의 클러스터형 인덱스를 포함할 수 있습니다. 여기에는 테이블에 대해 정의된 PRIMARY KEY 및 UNIQUE 제약 조건을 지원하기 위해 생성된 인덱스도 포함됩니다.
테이블 및 인덱스에 대한 공간 할당은 일반적으로 한 번에 한 익스텐트씩 이루어집니다. 테이블 또는 인덱스를 만들 때는 단일 익스텐트를 채울 만큼의 페이지를 가질 때까지 혼합 익스텐트에서 페이지를 할당합니다. 단일 익스텐트를 채울 정도로 충분한 페이지를 받은 이후에는 현재 할당된 익스텐트가 가득 찰 때마다 추가 익스텐트가 할당됩니다. 할당된 공간의 크기 및 테이블이 사용하는 공간의 크기에 대한 보고서를 만들려면 sp_spaceused를 실행하십시오.
데이터베이스 엔진은 열 정의에 DEFAULT, IDENTITY, ROWGUIDCOL 또는 열 제약 조건을 지정하는 특정한 순서를 요구하지는 않습니다.
QUOTED IDENTIFIER 옵션은 테이블을 만들 때 OFF로 설정되어 있더라도 해당 테이블의 메타데이터에 항상 ON으로 저장됩니다.
임시 테이블
로컬 및 전역 임시 테이블을 만들 수 있습니다. 로컬 임시 테이블은 현재 세션에서만 볼 수 있으며 전역 임시 테이블은 모든 세션에서 볼 수 있습니다. 임시 테이블은 분할할 수 없습니다.
로컬 임시 테이블 이름 앞에는 숫자 기호가 하나 추가되고(예: #table_name) 전역 임시 테이블 이름 앞에는 숫자 기호가 두 개 추가됩니다(예: ##table_name).
SQL 문은 예를 들어 CREATE TABLE 문의 table_name에 대해 지정된 값을 사용하여 임시 테이블을 참조합니다.
CREATE TABLE #MyTempTable (cola INT PRIMARY KEY);
INSERT INTO #MyTempTable VALUES (1);
단일 저장 프로시저나 일괄 처리 내에 둘 이상의 임시 테이블을 만드는 경우 그 이름이 서로 달라야 합니다.
여러 사용자가 동시에 실행할 수 있는 저장 프로시저 또는 응용 프로그램에서 로컬 임시 테이블을 만드는 경우 데이터베이스 엔진은 다른 사용자가 만든 테이블을 구별할 수 있어야 합니다. 데이터베이스 엔진은 내부적으로 각 로컬 임시 테이블 이름에 숫자 접미사를 추가하여 구별합니다. tempdb의 sysobjects 테이블에 저장된 것과 같은 임시 테이블의 전체 이름은 CREATE TABLE 문에서 지정한 테이블 이름과 시스템이 생성한 숫자 접미사로 구성됩니다. 접미사를 추가해야 하므로 로컬 임시 이름으로 지정된 table_name은 116자를 초과할 수 없습니다.
임시 테이블은 DROP TABLE을 사용하여 명시적으로 삭제하지 않으면 범위를 벗어날 때 자동으로 삭제됩니다.
저장 프로시저에서 만든 로컬 임시 테이블은 저장 프로시저를 마칠 때 자동으로 삭제합니다. 테이블은 해당 테이블을 만든 저장 프로시저가 실행하는 모든 중첩된 저장 프로시저에서 참조할 수 있습니다. 테이블을 만든 저장 프로시저를 호출한 프로세스는 해당 테이블을 참조할 수 없습니다.
기타 모든 로컬 임시 테이블은 현재 세션이 끝날 때 자동으로 삭제됩니다.
전역 임시 테이블은 테이블을 만든 세션이 끝나고 이를 참조하는 다른 모든 태스크가 중지되면 자동으로 삭제됩니다. 태스크와 테이블 간의 연결은 단일 Transact-SQL 문의 사용 기간 동안만 유지 관리됩니다. 즉, 전역 임시 테이블은 만들기 세션이 끝났을 때 테이블을 참조하고 있던 마지막 Transact-SQL 문이 완료되면 삭제됩니다.
저장 프로시저 또는 트리거에서 만드는 로컬 임시 테이블은 저장 프로시저 또는 트리거를 호출하기 전에 만든 임시 테이블과 같은 이름을 사용할 수 있습니다. 그러나 쿼리가 임시 테이블을 참조하고 이때 같은 이름을 가진 두 개의 임시 테이블이 동시에 존재하면 쿼리가 확인할 테이블은 정의되지 않습니다. 중첩된 저장 프로시저도 이를 호출한 저장 프로시저가 만든 임시 테이블과 같은 이름으로 임시 테이블을 만들 수 있습니다. 그러나 중첩된 프로시저에서 만든 테이블에 대한 수정 사항을 확인하려면 테이블의 구조 및 열 이름이 호출 프로시저가 만든 테이블과 같아야 합니다. 이는 다음 예에서 확인할 수 있습니다.
CREATE PROCEDURE dbo.Test2
AS
CREATE TABLE #t(x INT PRIMARY KEY);
INSERT INTO #t VALUES (2);
SELECT Test2Col = x FROM #t;
GO
CREATE PROCEDURE dbo.Test1
AS
CREATE TABLE #t(x INT PRIMARY KEY);
INSERT INTO #t VALUES (1);
SELECT Test1Col = x FROM #t;
EXEC Test2;
GO
CREATE TABLE #t(x INT PRIMARY KEY);
INSERT INTO #t VALUES (99);
GO
EXEC Test1;
GO
결과 집합은 다음과 같습니다.
(1 row(s) affected)
Test1Col
-----------
1
(1 row(s) affected)
Test2Col
-----------
2
로컬 또는 전역 임시 테이블을 만들 때 CREATE TABLE 구문은 FOREIGN KEY 제약 조건을 제외한 다른 모든 제약 조건 정의를 지원합니다. 임시 테이블에서 FOREIGN KEY 제약 조건을 지정하면 문에서 해당 제약 조건을 건너뛰었다는 경고 메시지를 반환하며 FOREIGN KEY 제약 조건 없이 테이블을 만듭니다. 임시 테이블은 FOREIGN KEY 제약 조건에서 참조할 수 없습니다.
임시 테이블 대신 테이블 변수를 사용하는 것이 좋습니다. 임시 테이블은 테이블에 명시적으로 인덱스를 만들어야 할 때 또는 여러 저장 프로시저 또는 함수에서 테이블 값을 보아야 할 때 유용합니다. 일반적으로 테이블 변수를 사용하면 쿼리 처리의 성능이 향상됩니다. 자세한 내용은 table(Transact-SQL)을 참조하십시오.
분할된 테이블
CREATE TABLE을 사용하여 분할된 테이블을 만들기 전에 테이블이 분할되는 방식을 지정하는 파티션 함수를 만들어야 합니다. CREATE PARTITION FUNCTION을 사용하여 파티션 함수를 만들 수 있습니다. 그런 다음 파티션 구성표를 만들어 파티션 함수가 표시하는 파티션을 유지하는 파일 그룹을 지정해야 합니다. CREATE PARTITION SCHEME을 사용하여 파티션 구성표를 만들 수 있습니다. 분할된 테이블에는 파일 그룹을 분리하는 PRIMARY KEY 또는 UNIQUE 제약 조건을 지정할 수 없습니다. 자세한 내용은 분할된 테이블 및 인덱스를 참조하십시오.
PRIMARY KEY 제약 조건
테이블은 하나의 PRIMARY KEY 제약 조건만 포함할 수 있습니다.
PRIMARY KEY 제약 조건에 의해 생성된 인덱스로 인해 테이블의 비클러스터형 인덱스가 999개, 클러스터형 인덱스가 1개를 초과할 수는 없습니다.
PRIMARY KEY 제약 조건에 대해 CLUSTERED 또는 NONCLUSTERED를 지정하지 않은 경우 UNIQUE 제약 조건에 대해 클러스터형 인덱스를 지정하지 않으면 CLUSTERED가 사용됩니다.
PRIMARY KEY 제약 조건 내에서 정의된 모든 열은 NOT NULL로 정의되어야 합니다. NULL 허용 여부를 지정하지 않은 경우에는 PRIMARY KEY 제약 조건에 참여하는 모든 열의 NULL 허용 여부가 NOT NULL로 설정됩니다.
CLR 사용자 정의 형식 열에 기본 키를 정의하는 경우 형식 구현이 이진 순서를 지원해야 합니다. 자세한 내용은 CLR 사용자 정의 형식을 참조하십시오.
UNIQUE 제약 조건
UNIQUE 제약 조건에 CLUSTERED 또는 NONCLUSTERED를 지정하지 않은 경우에는 기본적으로 NONCLUSTERED가 사용됩니다.
각 UNIQUE 제약 조건은 인덱스를 생성합니다. UNIQUE 제약 조건의 수가 많아도 테이블의 비클러스터형 인덱스는 999개, 클러스터형 인덱스는 1개를 초과할 수 없습니다.
CLR 사용자 정의 형식 열에 UNIQUE 제약 조건을 정의하는 경우 형식 구현이 이진 순서 또는 연산자 기반의 순서를 지원해야 합니다. 자세한 내용은 CLR 사용자 정의 형식을 참조하십시오.
FOREIGN KEY 제약 조건
FOREIGN KEY 제약 조건의 열에 NULL 외의 다른 값을 입력한 경우에는 그 값이 참조되는 열에 있어야 합니다. 그렇지 않은 경우에는 외래 키 위반 오류 메시지가 반환됩니다.
원본 열을 지정하지 않는 한 FOREIGN KEY 제약 조건이 선행 열에 적용됩니다.
FOREIGN KEY 제약 조건은 같은 서버의 같은 데이터베이스 내에 있는 테이블만 참조할 수 있습니다. 상호 데이터베이스 참조 무결성은 트리거를 통해 구현해야 합니다. 자세한 내용은 CREATE TRIGGER(Transact-SQL)를 참조하십시오.
FOREIGN KEY 제약 조건은 같은 테이블에 있는 다른 열을 참조할 수 있습니다. 이것을 자체 참조라고 합니다.
열 수준 FOREIGN KEY 제약 조건의 REFERENCES 절은 참조 열을 하나만 나열할 수 있습니다. 이 열의 데이터 형식은 제약 조건이 정의된 열의 데이터 형식과 같아야 합니다.
테이블 수준 FOREIGN KEY 제약 조건의 REFERENCES 절에는 제약 조건 열 목록의 열 개수와 같은 수의 참조 열이 있어야 합니다. 각 참조 열의 데이터 형식도 열 목록의 해당 열과 같아야 합니다.
timestamp 유형의 열이 외래 키 또는 참조 키의 일부인 경우에는 CASCADE, SET NULL 또는 SET DEFAULT를 지정할 수 없습니다.
CASCADE, SET NULL, SET DEFAULT 및 NO ACTION은 서로 참조 관계를 가진 테이블에서 결합될 수 있습니다. 데이터베이스 엔진이 NO ACTION을 발견하면 관련된 CASCADE, SET NULL 및 SET DEFAULT 동작을 멈추고 롤백합니다. DELETE 문으로 CASCADE, SET NULL, SET DEFAULT 및 NO ACTION 동작을 결합하면 데이터베이스 엔진이 NO ACTION을 확인하기 전에 모든 CASCADE, SET NULL 및 SET DEFAULT 동작을 적용합니다.
데이터베이스 엔진은 테이블에 포함하여 다른 테이블을 참조하는 FOREIGN KEY 제약 조건의 수나 특정 테이블을 참조하는 다른 테이블 소유의 FOREIGN KEY 제약 조건의 수에 미리 한계를 정의하지 않습니다.
하지만 실제로 사용할 수 있는 FOREIGN KEY 제약 조건의 수는 하드웨어 구성 및 데이터베이스와 응용 프로그램의 디자인에 따라 제한됩니다. 테이블에 포함되거나 이 테이블을 참조하는 FOREIGN KEY 제약 조건의 수가 각각 253개를 넘지 않도록 하는 것이 좋습니다. 유효 한계는 응용 프로그램과 하드웨어에 따라 더 많거나 적을 수 있습니다. 데이터베이스와 응용 프로그램을 디자인할 때는 FOREIGN KEY 제약 조건을 적용하는 비용도 고려하십시오.
임시 테이블에는 FOREIGN KEY 제약 조건이 적용되지 않습니다.
FOREIGN KEY 제약 조건은 참조되는 테이블의 PRIMARY KEY 또는 UNIQUE 제약 조건에 있는 열이나 참조되는 테이블의 UNIQUE INDEX에 있는 열만 참조할 수 있습니다.
CLR 사용자 정의 형식 열에 외래 키를 정의하는 경우 형식 구현이 이진 순서를 지원해야 합니다. 자세한 내용은 CLR 사용자 정의 형식을 참조하십시오.
varchar(max) 유형의 열은 자신이 참조하는 기본 키도 varchar(max) 유형으로 정의된 경우에만 FOREIGN KEY 제약 조건에 참여할 수 있습니다.
DEFAULT 정의
하나의 열에는 하나의 DEFAULT 정의만 있을 수 있습니다.
DEFAULT 정의는 상수 값, 함수, SQL-92 무항 함수 또는 NULL을 포함할 수 있습니다. 다음 표에서는 무항 함수 및 무항 함수가 INSERT 문에서 기본적으로 반환하는 값을 보여 줍니다.
SQL-92 무항 함수
반환 값
CURRENT_TIMESTAMP
현재 날짜 및 시간입니다.
CURRENT_USER
삽입을 수행하는 사용자의 이름입니다.
SESSION_USER
삽입을 수행하는 사용자의 이름입니다.
SYSTEM_USER
삽입을 수행하는 사용자의 이름입니다.
USER
삽입을 수행하는 사용자의 이름입니다.
DEFAULT 정의 내의 constant_expression은 해당 테이블이나 다른 테이블, 뷰 또는 저장 프로시저의 기타 열을 참조할 수 없습니다.
timestamp 데이터 형식의 열 또는 IDENTITY 속성이 있는 열에는 DEFAULT 정의를 만들 수 없습니다.
별칭 데이터 형식이 기본 개체에 바인딩된 경우에는 별칭 데이터 형식의 열에 대해 DEFAULT 정의를 만들 수 없습니다.
CHECK 제약 조건
하나의 열은 원하는 수만큼의 CHECK 제약 조건을 가질 수 있으며 조건은 AND 및 OR로 결합된 여러 논리 식을 포함할 수 있습니다. 열에 대한 여러 CHECK 제약 조건은 만든 순서대로 유효성이 검사됩니다.
검색 조건은 부울 식으로 계산되어야 하며 다른 테이블을 참조할 수 없습니다.
열 수준의 CHECK 제약 조건은 제약된 열만 참조할 수 있으며 테이블 수준의 CHECK 제약 조건은 같은 테이블의 열만 참조할 수 있습니다.
CHECK CONSTRAINTS 및 규칙은 INSERT 및 UPDATE 문 동안 데이터의 유효성을 검사하는 동일한 역할을 합니다.
열에 규칙 및 하나 이상의 CHECK 제약 조건이 있는 경우에는 모든 제한을 평가합니다.
text, ntext 또는 image 열에는 CHECK 제약 조건을 정의할 수 없습니다.
추가 제약 조건 정보
제약 조건용으로 만든 인덱스는 DROP INDEX를 사용하여 삭제할 수 없으며 제약 조건은 ALTER TABLE을 사용하여 삭제해야 합니다. 제약 조건이 만들고 사용하는 인덱스는 DBCC DBREINDEX를 사용하여 다시 작성할 수 있습니다.
제약 조건 이름은 식별자에 적용되는 규칙을 따라야 하지만 숫자 기호(#)로 시작될 수 없습니다. constraint_name을 지정하지 않으면 시스템에서 생성된 이름이 제약 조건에 할당됩니다. 제약 조건 이름은 제약 조건 위반에 대한 모든 오류 메시지에 표시됩니다.
INSERT, UPDATE 또는 DELETE 문에서 제약 조건을 위반한 경우에는 문이 종료됩니다. 하지만 SET XACT_ABORT를 OFF로 설정하면 문이 명시적 트랜잭션의 일부인 경우 그 트랜잭션은 계속 처리됩니다. SET XACT_ABORT를 ON으로 설정하면 전체 트랜잭션이 롤백됩니다. 또한 **@@**ERROR 시스템 함수를 확인하여 트랜잭션 정의와 함께 ROLLBACK TRANSACTION 문을 사용할 수 있습니다.
ALLOW_ROW_LOCKS = ON이고 ALLOW_PAGE_LOCK = ON이면 인덱스에 액세스할 때 행, 페이지 및 테이블 수준 잠금이 허용됩니다. 데이터베이스 엔진에서는 적절한 잠금을 선택하고 행 또는 페이지 잠금에서 테이블 잠금으로 에스컬레이션할 수 있습니다. 자세한 내용은 잠금 에스컬레이션(데이터베이스 엔진)을 참조하십시오. ALLOW_ROW_LOCKS = OFF이고 ALLOW_PAGE_LOCK = OFF이면 인덱스에 액세스할 때 테이블 수준 잠금만 허용됩니다. 인덱스에 대한 잠금 세분성을 구성하는 방법은 인덱스 잠금 사용자 지정을 참조하십시오.
테이블에 FOREIGN KEY 또는 CHECK CONSTRAINTS 및 트리거가 있는 경우에는 트리거를 실행하기 전에 제약 조건에 대한 조건을 평가합니다.
테이블 및 해당 열에 대한 보고서를 만들려면 sp_help 또는 sp_helpconstraint를 사용하십시오. 테이블의 이름을 바꾸려면 sp_rename을 사용하십시오. 테이블에 종속적인 뷰 및 저장 프로시저에 대한 보고서를 만들려면 sys.dm_sql_referenced_entities 및 sys.dm_sql_referencing_entities를 사용하십시오.
테이블 정의 내의 NULL 허용 여부 규칙
열의 Null 허용 여부에 따라 해당 열에 해당 열의 데이터로 Null 값(NULL)을 허용할 수 있는지 결정됩니다. NULL은 0 또는 공백이 아니며 항목을 만들지 않았거나 명시적인 NULL을 지정했음을 의미하는 것으로 일반적으로 값을 알 수 없거나 적용할 수 없음을 나타냅니다.
CREATE TABLE 또는 ALTER TABLE을 사용하여 테이블을 만들거나 변경하는 경우 데이터베이스 및 세션 설정은 열 정의에 사용되는 데이터 형식의 Null 허용 여부에 영향을 주거나 이를 무시할 수 있습니다. 비계산 열은 항상 NULL 또는 NOT NULL로 명시적으로 정의하는 것이 좋으며 사용자 정의 데이터 형식을 사용할 때는 열에 해당 데이터 형식의 기본 Null 허용 여부를 적용하는 것이 좋습니다. 스파스 열은 항상 NULL을 허용해야 합니다.
열의 Null 허용 여부를 명시적으로 지정하지 않은 경우 열의 Null 허용 여부는 다음 표의 규칙을 따릅니다.
열 데이터 형식 |
규칙 |
---|---|
별칭 데이터 형식 |
데이터베이스 엔진은 데이터 형식을 만들 때 지정한 Null 허용 여부를 사용합니다. 데이터 형식의 기본 Null 허용 여부를 결정하려면 sp_help를 사용합니다. |
CLR 사용자 정의 형식 |
열 정의에 따라 Null 허용 여부를 결정합니다. |
시스템이 제공하는 데이터 형식 |
시스템이 제공하는 데이터 형식에 옵션이 하나뿐인 경우에는 이 옵션이 우선 순위를 갖습니다. timestamp 데이터 형식은 NOT NULL이어야 합니다. SET를 사용하여 모든 세션 설정을 ON으로 설정한 경우:
|
세션에 대해 어떠한 ANSI_NULL_DFLT 옵션도 설정하지 않고 데이터베이스를 기본값(ANSI_NULL_DEFAULT가 OFF)으로 설정하면 기본값인 NOT NULL이 할당됩니다.
열이 계산 열인 경우에는 항상 데이터베이스 엔진이 열의 Null 허용 여부를 자동으로 결정합니다. 이런 유형을 가진 열의 Null 허용 여부를 알려면 COLUMNPROPERTY 함수에 AllowsNull 속성을 사용하십시오.
[!참고]
SQL Server ODBC 드라이버 및 SQL Server용 Microsoft OLE DB Provider는 모두 기본적으로 ANSI_NULL_DFLT_ON이 ON으로 설정되어 있습니다. ODBC 및 OLE DB 사용자는 ODBC 데이터 원본에서 이를 구성하거나 응용 프로그램이 설정한 연결 속성 또는 특성을 사용하여 이를 구성할 수 있습니다.
데이터 압축
시스템 테이블에는 압축을 사용할 수 없습니다. 테이블을 만들 때 데이터 압축은 달리 지정하지 않는 한 NONE으로 설정됩니다. 범위를 벗어난 파티션 목록을 지정하면 오류가 발생합니다. 데이터 압축에 대한 자세한 내용은 압축된 테이블 및 인덱스 만들기를 참조하십시오.
압축 상태를 변경할 경우 테이블, 인덱스 또는 파티션에 어떤 영향을 주는지 확인하려면 sp_estimate_data_compression_savings 저장 프로시저를 사용합니다.
사용 권한
데이터베이스에는 CREATE TABLE 권한이 필요하고 테이블을 만들 구성표에는 ALTER 권한이 필요합니다.
CREATE TABLE 문에 있는 열을 CLR 사용자 정의 형식으로 정의하는 경우 해당 형식의 소유권이나 이에 대한 REFERENCES 권한이 필요합니다.
CREATE TABLE 문의 열에 연관된 XML 스키마 컬렉션이 있는 경우 XML 스키마 컬렉션의 소유권이나 이에 대한 REFERENCES 권한이 필요합니다.
예
1. PRIMARY KEY 제약 조건 사용
다음 예에서는 AdventureWorks 예제 데이터베이스의 Employee 테이블(시스템이 제약 조건 이름을 제공하도록 허용)에서 EmployeeID 열의 클러스터형 인덱스가 있는 PRIMARY KEY 제약 조건 열 정의를 보여 줍니다.
EmployeeID int
PRIMARY KEY CLUSTERED
2. FOREIGN KEY 제약 조건 사용
FOREIGN KEY 제약 조건은 다른 테이블을 참조하는 데 사용됩니다. 외래 키는 단일 열 키 또는 복수 열 키가 될 수 있습니다. 다음 예에서는 SalesPerson 테이블을 참조하는 SalesOrderHeader 테이블에 대한 단일 열 FOREIGN KEY 제약 조건을 보여 줍니다. 단일 열 FOREIGN KEY 제약 조건에는 REFERENCES 절만 필요합니다.
SalesPersonID int NULL
REFERENCES SalesPerson(SalesPersonID)
또한 명시적으로 FOREIGN KEY 절을 사용하여 열 특성을 다시 정할 수 있습니다. 두 테이블에서 같은 열 이름을 사용할 필요는 없습니다.
FOREIGN KEY (SalesPersonID) REFERENCES SalesPerson(SalesPersonID)
테이블 제약 조건으로 복수 열 키 제약 조건을 만듭니다. AdventureWorks 데이터베이스에서 SpecialOfferProduct 테이블은 복수 열 PRIMARY KEY를 포함합니다. 다음 예에서는 다른 테이블에서 이 키를 참조하는 방법을 보여 줍니다. 명시적인 제약 조건 이름은 선택적입니다.
CONSTRAINT FK_SpecialOfferProduct_SalesOrderDetail FOREIGN KEY
(ProductID, SpecialOfferID)
REFERENCES SpecialOfferProduct (ProductID, SpecialOfferID)
3. UNIQUE 제약 조건 사용
UNIQUE 제약 조건은 기본 키가 아닌 열에 고유성을 적용합니다. 다음 예에서는 Product 테이블의 Name 열이 고유한 것이어야 한다는 제한을 적용합니다.
Name nvarchar(100) NOT NULL
UNIQUE NONCLUSTERED
4. DEFAULT 정의 사용
기본값은 값을 지정하지 않은 경우 사용할 값을 INSERT 및 UPDATE 문으로 제공합니다. 예를 들어 AdventureWorks 데이터베이스는 회사에서 직원이 담당하는 각기 다른 업무를 나열하는 조회 테이블을 포함할 수 있습니다. 각각의 업무를 기술하는 열에 실제 설명을 명시적으로 입력하지 않으면 문자열 기본값으로 설명을 제공할 수 있습니다.
DEFAULT 'New Position - title not formalized yet'
DEFAULT 정의는 제약 조건 외에도 함수를 포함할 수 있습니다. 항목의 현재 날짜를 보려면 다음 예를 사용하십시오.
DEFAULT (getdate())
무항 함수 검색도 데이터 무결성을 향상시킵니다. 행을 삽입한 사용자를 추적하려면 USER에 대한 무항 함수를 사용하십시오. 무항 함수를 괄호로 묶지 마십시오.
DEFAULT USER
5. CHECK 제약 조건 사용
다음 예에서는 Vendor 테이블의 CreditRating 열에 입력한 값에 대한 제한을 보여 줍니다. 제약 조건은 명명되지 않았습니다.
CHECK (CreditRating >= 1 and CreditRating <= 5)
다음 예에서는 테이블의 열에 입력된 문자 데이터에 대한 패턴 제한이 있는 명명된 제약 조건을 보여 줍니다.
CONSTRAINT CK_emp_id CHECK (emp_id LIKE
'[A-Z][A-Z][A-Z][1-9][0-9][0-9][0-9][0-9][FM]'
OR emp_id LIKE '[A-Z]-[A-Z][1-9][0-9][0-9][0-9][0-9][FM]')
다음 예에서는 값이 지정한 목록에 있도록 하거나 지정한 패턴을 따르도록 지정합니다.
CHECK (emp_id IN ('1389', '0736', '0877', '1622', '1756')
OR emp_id LIKE '99[0-9][0-9]')
6. 전체 테이블 정의 표시
다음 예에서는 AdventureWorks 데이터베이스에 만든 PurchaseOrderDetail 테이블에 대한 모든 제약 조건 정의를 가진 전체 테이블 정의를 보여 줍니다. 샘플을 실행하기 위해 테이블 스키마가 dbo로 변경됩니다.
CREATE TABLE [dbo].[PurchaseOrderDetail]
(
[PurchaseOrderID] [int] NOT NULL
REFERENCES Purchasing.PurchaseOrderHeader(PurchaseOrderID),
[LineNumber] [smallint] NOT NULL,
[ProductID] [int] NULL
REFERENCES Production.Product(ProductID),
[UnitPrice] [money] NULL,
[OrderQty] [smallint] NULL,
[ReceivedQty] [float] NULL,
[RejectedQty] [float] NULL,
[DueDate] [datetime] NULL,
[rowguid] [uniqueidentifier] ROWGUIDCOL NOT NULL
CONSTRAINT [DF_PurchaseOrderDetail_rowguid] DEFAULT (newid()),
[ModifiedDate] [datetime] NOT NULL
CONSTRAINT [DF_PurchaseOrderDetail_ModifiedDate] DEFAULT (getdate()),
[LineTotal] AS (([UnitPrice]*[OrderQty])),
[StockedQty] AS (([ReceivedQty]-[RejectedQty])),
CONSTRAINT [PK_PurchaseOrderDetail_PurchaseOrderID_LineNumber]
PRIMARY KEY CLUSTERED ([PurchaseOrderID], [LineNumber])
WITH (IGNORE_DUP_KEY = OFF)
)
ON [PRIMARY];
7. XML 스키마 컬렉션 유형의 xml 열을 가진 테이블 만들기
다음 예에서는 XML 스키마 컬렉션 HRResumeSchemaCollection 유형의 xml 열이 있는 테이블을 만듭니다. DOCUMENT 키워드는 column_name에 있는 xml 데이터 형식의 각 인스턴스가 하나의 최상위 요소만 포함하도록 지정합니다.
USE AdventureWorks;
GO
CREATE TABLE HumanResources.EmployeeResumes
(LName nvarchar(25), FName nvarchar(25),
Resume xml( DOCUMENT HumanResources.HRResumeSchemaCollection) );
8. 분할된 테이블 만들기
다음 예에서는 테이블이나 인덱스를 4개의 파티션으로 분할하는 파티션 함수를 만듭니다. 그런 다음 4개의 파티션을 각각 보관할 파일 그룹을 지정하는 파티션 구성표를 만듭니다. 마지막으로 파티션 구성표를 사용하는 테이블을 만듭니다. 이 예에서는 데이터베이스에 이미 파일 그룹이 있다고 가정합니다.
CREATE PARTITION FUNCTION myRangePF1 (int)
AS RANGE LEFT FOR VALUES (1, 100, 1000) ;
GO
CREATE PARTITION SCHEME myRangePS1
AS PARTITION myRangePF1
TO (test1fg, test2fg, test3fg, test4fg) ;
GO
CREATE TABLE PartitionTable (col1 int, col2 char(10))
ON myRangePS1 (col1) ;
GO
PartitionTable의 col1 열의 값을 바탕으로 하여 다음과 같은 방법으로 파티션을 할당합니다.
파일 그룹 |
test1fg |
test2fg |
test3fg |
test4fg |
---|---|---|---|---|
파티션 |
1 |
2 |
3 |
4 |
값 |
col 1 <= 1 |
col1 > 1 AND col1 <= 100 |
col1 > 100 AND col1 <= 1,000 |
col1 > 1000 |
9. 열에 uniqueidentifier 데이터 형식 사용
다음 예에서는 uniqueidentifier 열이 있는 테이블을 만듭니다. 이 예에서는 PRIMARY KEY 제약 조건을 사용하여 사용자가 중복 값을 삽입하지 못하도록 테이블을 보호하고 DEFAULT 제약 조건의 NEWSEQUENTIALID() 함수를 사용하여 새 행에 대한 값을 제공합니다. uniqueidentifier 열을 $ROWGUID 키워드로 참조할 수 있도록 이 열에 ROWGUIDCOL 속성이 적용됩니다.
CREATE TABLE dbo.Globally_Unique_Data
(guid uniqueidentifier CONSTRAINT Guid_Default DEFAULT NEWSEQUENTIALID() ROWGUIDCOL,
Employee_Name varchar(60)
CONSTRAINT Guid_PK PRIMARY KEY (guid) );
10. 계산 열에 식 사용
다음 예에서는 myavg 계산 열을 계산하기 위해 식((low + high)/2)을 사용하는 방법을 보여 줍니다.
CREATE TABLE dbo.mytable
( low int, high int, myavg AS (low + high)/2 ) ;
11. 사용자 정의 형식의 열을 기반으로 계산 열 만들기
다음 예에서는 유형의 어셈블리와 유형 자체를 현재 데이터베이스에 이미 만들었다고 가정하고 사용자 정의 형식 utf8string으로 정의된 하나의 열을 가진 테이블을 만드는 방법을 보여 줍니다. 두 번째 열은 utf8string을 기반으로 정의하고 type(class)utf8string의 ToString() 메서드를 사용하여 해당 열에 대한 값을 계산합니다.
CREATE TABLE UDTypeTable
( u utf8string, ustr AS u.ToString() PERSISTED ) ;
12. 계산 열에 USER_NAME 함수 사용
다음 예에서는 myuser_name 열에 USER_NAME() 함수를 사용하는 방법을 보여 줍니다.
CREATE TABLE dbo.mylogintable
( date_in datetime, user_id int, myuser_name AS USER_NAME() ) ;
13. FILESTREAM 열이 있는 테이블 만들기
다음 예에서는 FILESTREAM 열 Photo가 있는 테이블을 만듭니다. 하나 이상의 FILESTREAM 열이 있는 테이블에는 하나의 ROWGUIDCOL 열이 있어야 합니다.
CREATE TABLE dbo.EmployeePhoto
(
EmployeeId int NOT NULL PRIMARY KEY,
,Photo varbinary(max) FILESTREAM NULL
,MyRowGuidColumn uniqueidentifier NOT NULL ROWGUIDCOL
UNIQUE DEFAULT NEWID()
)
14. 행 압축을 사용하는 테이블 만들기
다음 예에서는 행 압축을 사용하는 테이블을 만듭니다.
CREATE TABLE T1
(c1 int, c2 nvarchar(200) )
WITH (DATA_COMPRESSION = ROW);
데이터 압축에 대한 다른 예를 보려면 압축된 테이블 및 인덱스 만들기를 참조하십시오.
15. 스파스 열 및 열 집합이 있는 테이블 만들기
다음 예에서는 스파스 열이 있는 테이블과 두 개의 스파스 열 및 열 집합이 있는 테이블을 만드는 방법을 보여 줍니다. 이 예에서는 기본 구문을 사용합니다. 더 복잡한 예는 스파스 열 사용 및 열 집합 사용을 참조하십시오.
스파스 열이 있는 테이블을 만들려면 다음 코드를 실행합니다.
CREATE TABLE T1
(c1 int PRIMARY KEY,
C2 varchar(50) SPARSE NULL ) ;
두 개의 스파스 열과 CSet이라는 열 집합이 있는 테이블을 만들려면 다음 코드를 실행합니다.
CREATE TABLE T1
(c1 int PRIMARY KEY,
C2 varchar(50) SPARSE NULL,
C3 int SPARSE NULL,
CSet XML COLUMN_SET FOR ALL_SPARSE_COLUMNS ) ;
참고 항목