본문 바로가기

wow db Log/ms-sql

[팁] 이젠 외우자.. ALTER TABLE

########  ALTER TABLE Syntax  ########

ALTER TABLE table
{ [ ALTER COLUMN column_name
     { new_data_type [ ( precision [ , scale ] ) ]
         [ COLLATE < collation_name > ]
         [ NULL | NOT NULL ]
         | {ADD | DROP } ROWGUIDCOL }
    ]
     | ADD
         { [ < column_definition > ]
         | column_name AS computed_column_expression
         } [ ,...n ]
     | [ WITH CHECK | WITH NOCHECK ] ADD
         { < table_constraint > } [ ,...n ]
     | DROP
         { [ CONSTRAINT ] constraint_name
             | COLUMN column } [ ,...n ]
     | { CHECK | NOCHECK } CONSTRAINT
         { ALL | constraint_name [ ,...n ] }
     | { ENABLE | DISABLE } TRIGGER
         { ALL | trigger_name [ ,...n ] }
}

< column_definition > ::=
     { column_name data_type }
    [ [ DEFAULT constant_expression ] [ WITH VALUES ]
     | [ IDENTITY [ ( seed , increment ) [ NOT FOR REPLICATION ] ] ]
        ]
     [ ROWGUIDCOL ]
     [ COLLATE < collation_name > ]
     [ < column_constraint > ] [ ...n ]

< column_constraint > ::=
     [ CONSTRAINT constraint_name ]
     { [ NULL | NOT NULL ]
         | [ { PRIMARY KEY | UNIQUE }
             [ CLUSTERED | NONCLUSTERED ]
             [WITH FILLFACTOR = fillfactor]
             [ ON { filegroup | DEFAULT } ]
            ]
         | [ [ FOREIGN KEY ]
             REFERENCES ref_table [ ( ref_column ) ]
             [ ON DELETE { CASCADE | NO ACTION } ]
             [ ON UPDATE { CASCADE | NO ACTION } ]
             [ NOT FOR REPLICATION ]
            ]
         | CHECK [ NOT FOR REPLICATION ]
             ( logical_expression )
    }

< table_constraint > ::=
     [ CONSTRAINT constraint_name ]
     { [ { PRIMARY KEY | UNIQUE }
         [ CLUSTERED | NONCLUSTERED ]
         { ( column [ ,...n ] ) }
         [WITH FILLFACTOR = fillfactor]
         [ ON { filegroup | DEFAULT } ]
        ]
        |     FOREIGN KEY
             [ ( column [ ,...n ] ) ]
             REFERENCES ref_table [ ( ref_column [ ,...n ] ) ]
             [ ON DELETE { CASCADE | NO ACTION } ]
             [ ON UPDATE { CASCADE | NO ACTION } ]
             [ NOT FOR REPLICATION ]
         | DEFAULT constant_expression
            [ FOR column ] [ WITH VALUES ]
        |     CHECK [ NOT FOR REPLICATION ]
             ( search_conditions )
    }


인수

table

변경할 테이블의 이름입니다. 테이블이 현재 데이터베이스에 없거나 현재 사용자가 소유한 테이블이 아닐 경우 데이터베이스와 소유자를 명시적으로 지정해야 합니다.

ALTER COLUMN

지정한 열을 변경하도록 지정합니다. 호환성 수준이 65 이하일 경우 ALTER COLUMN을 사용할 수 없습니다. 자세한 내용은 sp_dbcmptlevel을 참조하십시오.

다음과 같은 열은 변경할 수 없습니다.

  • text, image, ntext, timestamp 데이터 형식을 가진 열

  • 테이블의 ROWGUIDCOL

  • 계산된 열이나 계산된 열에 사용된 열

  • 복제된 열

  • 열이 varchar, nvarchar 또는 varbinary 데이터 형식이 아닐 경우 인덱스에 사용된 열. 데이터 형식이 변경되지 않고, 새 크기는 원래의 크기보다 크거나 같습니다.

  • CREATE STATISTICS 문으로 생성된 통계에 사용된 열. 먼저 DROP STATISTICS 문을 사용하여 통계를 제거합니다. 쿼리 최적화 프로그램에 의해 자동으로 생성된 통계는 ALTER COLUMN에 의해 자동으로 삭제됩니다.

  • PRIMARY KEY 또는 [FOREIGN KEY] REFERENCES 제약 조건에 사용된 열

  • CHECK 또는 UNIQUE 제약 조건에 사용된 열(CHECK 또는 UNIQUE 제약 조건에 사용된 가변 길이 열의 길이 변경이 허용된 경우 제외)

  • 기본값과 연결된 열(데이터 형식이 변경되지 않는다면 열 길이, 정밀도, 배율 변경이 허용되는 경우 제외)

데이터 형식을 변경하면 데이터 자체가 변경되는 경우도 있습니다. 예를 들어, nchar 또는 nvarchar 열을 char 또는 varchar로 변경하면 확장 문자가 변경될 수 있습니다. 자세한 내용은 CAST 및 CONVERT를 참조하십시오. 열의 정밀도와 배율을 줄이면 데이터가 잘릴 수 있습니다.

column_name

변경, 추가, 삭제될 열의 이름입니다. 새로운 열의 경우 timestamp 데이터 형식으로 만들어진 열에는 column_name을 생략할 수 있습니다. timestamp 데이터 형식 열에 column_name을 지정하지 않으면 timestamp라는 이름이 사용됩니다.

new_data_type

변경된 열의 새 데이터 형식입니다. 변경된 열의 new_data_type에 대한 기준은 다음과 같습니다.

  • 이전 데이터 형식은 새 데이터 형식으로 변환 가능해야 합니다.

  • new_data_typetimestamp가 될 수 없습니다.

  • ALTER COLUMN에 대해 ANSI NULL 기본값은 항상 on입니다. 값을 지정하지 않으면 열에 Null이 허용됩니다.

  • ALTER COLUMN에 대해 ANSI padding은 항상 on입니다.

  • 변경된 열이 ID 열이면 new_data_type은 ID 속성을 지원하는 데이터 형식이어야 합니다.

  • SET ARITHABORT의 현재 설정이 무시됩니다. ALTER TABLE은 ARITHABORT 옵션이 ON인 것처럼 작동됩니다.

precision

지정한 데이터 형식의 정밀도입니다. 유효한 정밀도 값에 대한 자세한 내용은 정밀도, 배율, 길이를 참조하십시오.

scale

지정한 데이터 형식의 배율입니다. 유효한 배율 값에 대한 자세한 내용은 정밀도, 배율, 길이를 참조하십시오.

COLLATE < collation_name >

열에 대한 데이터 정렬을 지정합니다. 데이터 정렬 이름으로는 Windows 데이터 정렬 이름 또는 SQL 데이터 정렬 이름을 사용할 수 있습니다. 목록 및 자세한 내용은 Windows 데이터 정렬 이름SQL 데이터 정렬 이름을 참조하십시오.

COLLATE 절은 char, varchar, text, nchar, nvarcharntext 데이터 형식 열의 데이터 정렬을 변경하는 데만 사용할 수 있습니다. 이를 지정하지 않으면 열에 데이터베이스의 기본 정렬이 할당됩니다.

ALTER COLUMN은 다음 조건 중 하나라도 해당되는 것이 있는 경우에는 데이터 정렬을 변경할 수 없습니다.

  • CHECK, FOREIGN KEY제약 조건 또는 계산된 열이 변경된 열을 참조하는 경우.

  • 인덱스, 통계 또는 전체 텍스트 인덱스가 열에 대해 만들어진 경우. 변경된 열에 대해 자동으로 만들어진 통계는 해당 열의 데이터 정렬이 변경되면 삭제됩니다.

  • SCHEMABOUND 뷰 또는 함수가 열을 참조하는 경우.

COLLATE 절에 대한 자세한 내용은 COLLATE를 참조하십시오.

NULL | NOT NULL

열에 null 값 허용 여부를 지정합니다. null 값이 허용되지 않는 열은 기본값이 지정된 경우에만 ALTER TABLE을 사용하여 추가할 수 있습니다. 즉, 테이블에 새로 추가된 열은 null 값을 허용하거나 기본값이 지정되어 있어야 합니다.

새 열이 null 값을 허용하고 기본값이 지정되지 않은 경우, 새 열은 테이블의 각 행에 대해 null 값을 가집니다. 새 열이 null 값을 허용하고 기본 정의가 추가된 경우, WITH VALUES 옵션을 사용하여 새 열에 테이블의 각 기존 행에 대한 기본값을 저장할 수 있습니다.

새 열이 null 값을 허용하지 않을 경우, DEFAULT 정의가 추가되어야만 합니다. 그러면 각 기존 행에 대해 새 열에 자동으로 기본값이 로드됩니다.

PRIMARY KEY 제약 조건이 있는 열을 제외하면 ALTER COLUMN에 NULL을 지정하여 NOT NULL 열이 null 값을 허용하도록 만들 수 있습니다. 열에 null 값이 포함되어 있지 않을 경우에만 ALTER COLUMN에 NOT NULL을 지정할 수 있습니다. ALTER COLUMN NOT NULL이 허용되기 전에 다음과 같이 null 값을 다른 값으로 업데이트해야 합니다.

UPDATE MyTable SET NullCol = N'some_value' WHERE NullCol IS NULL ALTER TABLE MyTable ALTER COLUMN NullCOl NVARCHAR(20) NOT NULL

ALTER COLUMN에 NULL 또는 NOT NULL을 지정할 때는 new_data_type [(precision [, scale ])]도 함께 지정해야 합니다. 데이터 형식, 정밀도, 배율이 변경되지 않으면 현재 열 값을 지정합니다.

[ {ADD | DROP} ROWGUIDCOL ]

지정한 열에 ROWGUIDCOL 속성을 추가 또는 삭제하도록 지정합니다. ROWGUIDCOL은 해당 열이 행에 대한 전역 고유 식별자 열임을 나타내는 키워드입니다. 테이블마다 하나의 uniqueidentifier 열만을 ROWGUIDCOL 열로 지정할 수 있습니다. ROWGUIDCOL 특성은 uniqueidentifier 열에 대해서만 할당할 수 있습니다.

ROWGUIDCOL 특성은 열에 저장된 값이 고유하도록 설정하지 않습니다. 또한 테이블에 삽입된 새 행에 대한 값을 자동으로 생성하지도 않습니다. 각 열에 대해 고유한 값을 생성하려면 INSERT 문에서 NEWID 함수를 사용하거나 NEWID 함수를 해당 열의 기본값으로 지정합니다.




ADD

하나 이상의 열 정의, 계산된 열 정의, 테이블 제약 조건이 추가되도록 지정합니다.

computed_column_expression

계산된 열의 값을 정의하는 식입니다. 계산된 열은 테이블에 물리적으로 저장된 열이 아니라 해당 테이블의 다른 열을 사용한 식에서 계산된 가상의 열입니다. 예를 들어, 계산된 열은 cost AS price * qty와 같은 정의를 가질 수 있습니다. 식은 계산되지 않은 열 이름, 상수, 함수, 변수 및 이러한 연산자를 하나 이상 연결한 결합이 될 수 있습니다. 식은 하위 쿼리가 될 수 없습니다.

다음과 같은 경우를 제외하면 선택 목록, WHERE 절, ORDER BY 절 및 정규식이 사용되는 모든 위치에 계산된 열을 사용할 수 있습니다.

  • 계산된 열은 DEFAULT 또는 FOREIGN KEY 제약조건 정의로 사용하거나 NOT NULL 제약 조건 정의와 함께 사용할 수 없습니다. 그러나 계산된 열 값이 명확한 식에 의해 정의되고 결과의 데이터 형식이 인덱스 열에 허용되는 경우에는 계산된 열을 인덱스내의 키 열 또는 임의의 PRIMARY KEY 또는 UNIQUE 제약 조건의 일부로 사용할 수 있습니다.

    예를 들어, 테이블에 ab라는 정수 열이 있을 때 계산된 열 a+b에는 인덱스를 작성할 수 있지만 계산된 열 a+DATEPART(dd, GETDATE())는 다음 호출 시 값이 바뀌므로 인덱스를 작성할 수 없습니다.

  • 계산된 열은 INSERT 또는 UPDATE 문의 대상이 될 수 없습니다.

    참고   테이블의 각 행은 계산된 열에 포함된 열에 대해 다른 값을 가질 수 있으므로 계산된 열은 각 행에 동일한 결과를 갖지 않을 수도 있습니다.

n

선행하는 항목이 n 번 반복될 수 있음을 표시하는 자리 표시자입니다.

WITH CHECK | WITH NOCHECK

새로 추가되거나 다시 설정된 FOREIGN KEY 또는 CHECK 제약 조건에 대해 테이블의 데이터 유효성 검사 여부를 지정합니다. 값을 지정하지 않으면 새 제약 조건에는 WITH CHECK가, 다시 설정된 제약 조건에는 WITH NOCHECK가 설정됩니다.

WITH CHECK 및 WITH NOCHECK 절은 PRIMARY KEY 및 UNIQUE 제약 조건에 사용할 수 없습니다.

기존 데이터에 대해 새로운 CHECK 또는 FOREIGN KEY 제약 조건을 검사하지 않으려면 WITH NOCHECK을 사용합니다. 하지만 이 방법은 꼭 필요한 경우를 제외하면 사용하지 않는 것이 좋습니다. 새로운 제약 조건은 향후 업데이트 시 모두 평가됩니다. 따라서 제약 조건 추가 시 WITH NOCHECK에 의해 숨겨진 제약 조건 위반은 제약 조건에 위배되는 데이터를 가진 행을 업데이트할 경우 업데이트 오류를 발생시킬 수 있습니다.

WITH NOCHECK이 정의된 제약 조건은 쿼리 최적화 프로그램에서 고려되지 않으며 ALTER TABLE table CHECK CONSTRAINT ALL을 사용하여 다시 설정될 때까지 무시됩니다.

DROP { [CONSTRAINT] constraint_name | COLUMN column_name }

테이블에서 constraint_name 또는 column_name이 제거되도록 지정합니다. 호환성 수준이 65 이하일 경우에는 DROP COLUMN이 허용되지 않으며 여러 개의 열과 제약 조건을 동시에 지정할 수 있습니다. 다음과 같은 경우에는 열을 삭제할 수 없습니다.

  • 복제된 열

  • 인덱스에 사용된 열

  • CHECK, FOREIGN KEY, UNIQUE, PRIMARY KEY 제약 조건에 사용된 열

  • DEFAULT 키워드로 정의된 기본값과 연결되거나 기본 개체에 바인딩된 열

  • 규칙에 바인딩된 열

{ CHECK | NOCHECK} CONSTRAINT

constraint_name의 설정 여부를 지정합니다. 이 옵션이 해제된 경우 해당 열에 삽입, 업데이트 시 제약 조건에 대한 유효성 검사를 수행하지 않습니다. 이 옵션은 FOREIGN KEY 및 CHECK 제약 조건에서만 사용할 수 있습니다.

ALL
NOCHECK 옵션을 사용하여 모든 제약 조건을 해제하거나 CHECK 옵션을 사용하여 모든 제약 조건을 설정하도록 지정합니다.

{ENABLE | DISABLE} TRIGGER

trigger_name의 설정 여부를 지정합니다. 트리거를 해제해도 테이블에서 트리거의 정의는 계속 유지됩니다. 하지만 트리거가 다시 설정될 때까지 테이블에 대해 INSERT, UPDATE, DELETE 문이 실행될 때 트리거의 작업은 수행되지 않습니다.

ALL
테이블의 모든 트리거를 설정 또는 해제하도록 지정합니다.
trigger_name
설정하거나 해제할 트리거의 이름을 지정합니다.

column_name data_type

새 열의 데이터 형식입니다. data_type은 모든 Microsoft® SQL Server™ 데이터 형식이나 사용자 정의 데이터 형식이 될 수 있습니다.

DEFAULT

열의 기본값을 지정하는 키워드입니다. DEFAULT 정의를 사용하여 기존 데이터 행에 새 열의 값을 제공할 수 있습니다. timestamp 데이터 형식, IDENTITY 속성, 기존 DEFAULT 정의, 바인딩된 기본값을 가진 열에는 DEFAULT 정의를 추가할 수 없습니다. 기존 기본값이 있는 열은 새 기본값을 추가하기 전에 기존 기본값을 삭제해야 합니다. 이전 버전의 SQL Server와 호환성을 유지하기 위해 DEFAULT에 제약 조건 이름을 할당할 수 있습니다.

IDENTITY

새 열이 ID 열임을 지정합니다. 테이블에 새 행이 추가되면 SQL Server는 열에 대해 고유한 증가 값을 제공합니다. ID 열은 일반적으로 PRIMARY KEY 제약 조건과 함께 사용되어 테이블에 대한 고유한 행 식별자 역할을 합니다. tinyint, smallint, int, bigint, decimal(p,0) 또는 numeric(p,0) 열에 IDENTITY 속성을 할당할 수 있습니다. ID 열은 각 테이블마다 하나만 만들 수 있습니다. DEFAULT 키워드와 바인딩된 기본값은 ID 열과 함께 사용할 수 없습니다. 시드와 증가 값을 모두 지정하거나 아무 것도 지정하지 말아야 합니다. 아무 것도 지정하지 않으면 기본값은 (1,1)입니다.

Seed
테이블에 로드된 첫 번째 행에 사용되는 값입니다.
Increment
로드된 이전 행의 ID 값에 추가되는 증분값입니다.

NOT FOR REPLICATION

복제 로그인(예: sqlrepl)이 테이블에 데이터를 삽입할 때 IDENTITY 속성을 강제하지 않도록 지정합니다. NOT FOR REPLICATION을 제약 조건에 지정할 수도 있습니다. 그러면 복제 로그인이 테이블에 데이터를 삽입할 때 제약 조건을 검사하지 않습니다.

CONSTRAINT

PRIMARY KEY, UNIQUE, FOREIGN KEY, CHECK 제약 조건이나 DEFAULT 정의의 시작을 지정합니다.

constraint_name

새 제약 조건입니다. 제약 조건 이름은 반드시 식별자에 대해 적용되는 규칙을 따라야 합니다. 단, 숫자 기호(#)로 이름을 시작할 수 없습니다. constraint_name을 지정하지 않으면 시스템에서 생성된 이름이 제약 조건에 할당됩니다.

PRIMARY KEY

지정한 열 또는 열들에 대해 고유한 인덱스를 통해 엔티티 무결성을 설정하는 제약 조건입니다. PRIMARY KEY 제약 조건은 테이블 당 한 개만 만들 수 있습니다.

UNIQUE

지정한 열 또는 열들에 대해 고유한 인덱스를 통해 엔티티 무결성을 제공하는 제약 조건입니다..

CLUSTERED | NONCLUSTERED

PRIMARY KEY 또는 UNIQUE 제약 조건에 대해 클러스터된 인덱스나 클러스터되지 않은 인덱스를 만들도록 지정합니다. PRIMARY KEY 제약 조건은 기본적으로 CLUSTERED로, UNIQUE 제약 조건은 기본적으로 NONCLUSTERED로 설정됩니다.

테이블에 클러스터된 제약 조건이나 인덱스가 이미 존재하면 ALTER TABLE에 CLUSTERED를 지정할 수 없습니다. 이 경우 PRIMARY KEY 제약 조건은 기본적으로 NONCLUSTERED로 설정됩니다.

WITH FILLFACTOR = fillfactor

전체 SQL Server가 인덱스 데이터를 저장하는 데 사용하는 각 인덱스 페이지를 만드는 방법을 지정합니다. 사용자가 지정한 fillfactor 값은 1에서 100 사이이고, 값을 지정하지 않으면 기본값은 0입니다. fillfactor 값이 낮으면 새 인덱스 항목이 사용할 수 있는 여유 공간이 많아지므로 공간을 새로 할당할 필요가 없습니다. 자세한 내용은 CREATE INDEX를 참조하십시오.

ON {filegroup | DEFAULT}

제약 조건에 대해 만들어진 인덱스의 저장 위치를 지정합니다. filegroup을 지정하면 명명된 파일 그룹에 인덱스가 만들어지고 DEFAULT를 지정하면 기본 파일 그룹에 인덱스가 만들어집니다. ON을 지정하지 않으면 테이블이 포함된 파일 그룹에 인덱스가 만들어집니다. PRIMARY KEY 또는 UNIQUE 제약 조건에 대한 클러스터된 인덱스 추가 시 ON을 지정하면 클러스터된 인덱스가 만들어질 때 전체 테이블이 지정한 파일 그룹으로 옮겨집니다.

이 경우 DEFAULT는 키워드가 아니라 기본 파일 그룹을 나타내는 식별자이므로 ON "DEFAULT"나 ON [DEFAULT]에서처럼 구분 기호로 분리되야 합니다.

FOREIGN KEY...REFERENCES

특정 열의 데이터에 대한 참조 무결성을 제공하는 제약 조건입니다. FOREIGN KEY 제약 조건은 해당 열의 각 값이 참조되는 테이블의 지정한 열에 있어야 합니다.

ref_table

FOREIGN KEY 제약 조건에 의해 참조되는 테이블입니다.

ref_column

새 FOREIGN KEY 제약 조건에 의해 참조되는 열 또는 열 목록을 괄호 안에 표시합니다.

ON DELETE {CASCADE | NO ACTION}

참조 관계가 있는 행의 부모 테이블에서 참조되는 행이 삭제될 경우 변경된 테이블의 행에 어떤 일이 발생할지를 지정합니다. 기본값은 NO ACTION입니다.

CASCADE를 지정한 경우, 행이 부모 테이블에서 삭제되면 참조하는 테이블에서 해당 행이 삭제됩니다. NO ACTION을 지정한 경우에는 SQL Server에서 오류가 발생하고 부모 테이블에 있는 행에 대한 삭제 작업이 롤백됩니다.

해당 테이블에 ON DELETE INSTEAD OF 트리거가 존재할 경우 ON DELETE CASCADE 작업을 정의할 수 없습니다.

예를 들어, Northwind 데이터베이스에서 Orders 테이블이 Customers 테이블과 참조 관계라고 가정해 봅시다. Orders.CustomerID 외래 키는 Customers.CustomerID 기본 키를 참조합니다.

Customers 테이블의 행에서 DELETE 문이 실행되고 Orders.CustomerID에 대해 ON DELETE CASCADE 작업을 지정한 경우, SQL Server는 Orders 테이블에서 하나 이상의 종속 행을 확인합니다. Orders 테이블에 종속 행이 있으면 Customers 테이블에 있는 참조되는 행과 함께 삭제됩니다.

한편 NO ACTION을 지정한 경우, Orders 테이블에 적어도 하나 이상의 참조하는 행이 있으면 SQL Server에서 오류가 발생하고 Customers 행에서 삭제 작업을 롤백합니다.

ON UPDATE {CASCADE | NO ACTION}

참조 관계가 있는 행의 부모 테이블에서 참조되는 행이 업데이트될 경우 변경된 테이블의 행에 어떤 일이 발생할지를 지정합니다. 기본값은 NO ACTION입니다.

CASCADE를 지정한 경우에는 부모 테이블에서 행이 업데이트되면 참조하는 테이블에서 해당 행이 업데이트됩니다. NO ACTION을 지정한 경우에는 SQL Server에서 오류가 발생하고 부모 테이블의 행에 대한 업데이트 작업이 롤백됩니다.

해당 테이블에 ON UPDATE INSTEAD OF 트리거가 존재할 경우 ON UPDATE CASCADE 작업을 정의할 수 없습니다.

예를 들어, Northwind 데이터베이스에서 Orders 테이블이 Customers 테이블과 참조 관계라고 가정해 봅시다. Orders.CustomerID 외래 키는 Customers.CustomerID 기본 키를 참조합니다.

Customers 테이블의 행에서 UPDATE 문이 실행되고 Orders.CustomerID에 대해 ON UPDATE CASCADE 작업을 지정한 경우, SQL Server는 Orders 테이블에서 하나 이상의 종속 행을 확인합니다. Orders 테이블에 종속 행이 있으면 Customers 테이블에 있는 참조되는 행과 함께 업데이트됩니다.

반면, NO ACTION을 지정하면 Orders 테이블에 Customers 행을 참조하는 행이 하나라도 있을 경우 오류가 발생하고 Customers 행의 업데이트 작업이 롤백됩니다.

[ASC | DESC]

테이블 제약 조건에 사용하는 열을 저장하는 순서를 지정합니다. 기본값은 ASC입니다.

WITH VALUES

DEFAULT constant_expression에 지정된 값이 기존 행에 추가된 새 열에 저장되는지를 지정합니다. ADD 열 절에 DEFAULT가 지정된 경우에만 WITH VALUES를 지정할 수 있습니다. 추가된 열이 null 값을 허용하고 WITH VALUES를 지정하면 기존 행에 추가된 새 열에 기본값이 저장됩니다. null 값을 허용하는 열에 WITH VALUES를 지정하지 않으면 NULL 값이 기존 행의 새 열에 저장됩니다. 새 열이 null 값을 허용하지 않으면 WITH VALUES의 지정 여부에 관계 없이 새 행에 기본값이 저장됩니다.

column[,...n]

새 제약 조건에 사용되는 열 또는 열 목록을 괄호 안에 표시합니다.

constant_expression

기본 열 값으로 사용되는 리터럴 값, NULL, 시스템 함수입니다.

FOR column

테이블 수준 DEFAULT 정의와 관련된 열을 지정합니다.

CHECK

열 또는 열들에 입력할 수 있는 가능한 값을 제한하여 도메인 무결성을 설정하는 제약 조건입니다.

logical_expression

CHECK 제약 조건에 사용되는 논리 식으로서 TRUE 또는 FALSE를 반환합니다. CHECK 제약 조건과 함께 사용되는 Logical_expression은 다른 테이블을 참조할 수 없고 동일한 테이블의 다른 열만 참조할 수 있습니다.

비고

새 데이터 행을 추가하려면 INSERT 문을 사용합니다. 데이터 행을 제거하려면 DELETE 문이나 TRUNCATE TABLE 문을 사용합니다. 기존 행의 값을 변경하려면 UPDATE를 사용합니다.

ALTER TABLE에 지정된 변경 사항은 즉시 적용됩니다. 변경 시 테이블의 행을 수정할 필요가 있으면 ALTER TABLE은 행을 업데이트합니다. ALTER TABLE은 변경이 진행되는 동안 다른 연결에서 테이블의 메타데이터도 참조할 수 없도록 테이블에 대해 스키마 수정 잠금을 얻습니다. 테이블의 수정 사항은 모두 로그되고 완전히 복구 가능합니다. 열 삭제나 기본값이 있는 NOT NULL 열 추가 등 커다란 테이블의 모든 행에 영향을 주는 변경 작업은 실행 시간이 오래 걸리고 많은 로그 레코드를 생성합니다. 이러한 ALTER TABLE 문은 많은 행에 영향을 주는 INSERT, UPDATE, DELETE 문과 마찬가지로 주의 깊게 실행해야 합니다.

테이블을 참조하는 프로시저 캐시에 실행 계획이 있을 경우 ALTER TABLE은 다음 실행 시 이를 다시 컴파일하도록 표시합니다.

ALTER TABLE 문이 다른 테이블에 의해 참조되는 열 값에 대한 변경을 지정하면 참조하는 테이블에서 ON UPDATE 또는 ON DELETE에 지정된 작업에 따라 둘 중 한 이벤트가 발생합니다.

  • 참조하는 테이블에 값이 지정되어 있지 않거나 NO ACTION(기본값)이 지정되어 있으면 다른 테이블에 의해 참조되는 열 값을 변경시킨 부모 테이블에 대한 ALTER TABLE 문이 롤백되고 SQL Server에 오류가 발생합니다.

  • 참조하는 테이블에 CASCADE가 지정되어 있으면 부모 테이블에 대한 ALTER TABLE 문에서 발생한 변경 사항이 부모 테이블과 종속 행에 적용됩니다.

sql_variant 열을 추가하는 ALTER TABLE 문의 경우, 다음과 같은 경고가 발생할 수 있습니다.

'yy' 테이블의 크기 (xx) 행의 최대 바이트 (8060) 초과했습니다. 최대 바이트 수를 초과하는 행은 추가되지 않습니다.

이 경고는 sql_variant의 길이가 최대 8016바이트까지 허용되므로 발생합니다. sql_variant 열이 최대 길이에 가까운 값을 포함한 경우, 행의 최대 크기 제한을 초과할 수 있습니다.

스키마 바운드 뷰를 가진 테이블에서 ALTER TABLE 문에 적용되는 제한은 단순 인덱스를 가진 테이블 변경 시 적용되는 제한과 동일합니다. 즉, 열을 추가할 수는 있지만 스키마 바운드 뷰에 포함된 열을 제거하거나 변경하는 것은 허용되지 않습니다. ALTER TABLE 문이 스키마 바운드 뷰에 사용된 열을 변경해야 할 경우 변경 작업이 실패하고 SQL Server에 오류 메시지가 나타납니다. SCHEMABINDING 뷰 및 인덱스된 뷰에 대한 자세한 내용은 CREATE VIEW를 참조하십시오.

기본 테이블의 트리거 추가 삭제는 해당 테이블을 참조하는 스키마 바운드 뷰를 만들어도 영향을 받지 않습니다.

제약 조건의 일부로 만들어진 인덱스는 제약 조건을 삭제하면 함께 삭제됩니다. CREATE INDEX로 만들어진 인덱스는 DROP INDEX 문을 사용하여 삭제해야 합니다. DBCC DBREINDEX 문을 사용하면 제약 조건 정의의 일부로 인덱스를 다시 작성할 수 있습니다. 이 때 ALTER TABLE을 사용하여 제약 조건을 다시 삭제하거나 추가할 필요가 없습니다.

열을 제거하려면 먼저 해당 열을 기준으로 만들어진 인덱스와 제약 조건을 모두 제거해야 합니다.

제약 조건이 추가되면 제약 조건 위반에 대해 기존의 모든 데이터를 검사합니다. 제약 조건 위반이 발생할 경우 ALTER TABLE 문이 실패하고 오류가 반환됩니다.

기존 열에 PRIMARY KEY 또는 UNIQUE 제약 조건을 새로 추가하려면 해당 열의 데이터가 고유해야 합니다. 중복된 값이 발견되면 ALTER TABLE 문이 실패합니다. PRIMARY KEY 또는 UNIQUE 제약 조건을 추가할 때는 WITH NOCHECK 옵션이 효과가 없습니다.

각 PRIMARY KEY 및 UNIQUE 제약 조건은 인덱스를 생성합니다. UNIQUE 및 PRIMARY KEY 제약 조건의 개수가 아무리 많아도 테이블에 클러스터되지 않은 인덱스는 249개, 클러스터된 인덱스는 1개 이상 만들 수 없습니다.

uniqueidentifier 데이터 형식을 가진 열이 추가되면 NEWID() 함수를 사용하여 새 열에 테이블의 각 기존 행에 대한 고유한 식별자 값을 제공하는 기본값을 정의할 수 있습니다.

SQL Server는 열 정의에서 DEFAULT, IDENTITY, ROWGUIDCOL 또는 열 제약 조건을 지정하는 순서를 설정하지 않습니다.

ALTER TABLE의 ALTER COLUMN 절은 열에 규칙을 바인딩하거나 언바인딩하지 않습니다. 규칙은 sp_bindrule 또는 sp_unbindrule을 사용하여 별도로 바인딩하거나 언바인딩해야 합니다.

사용자 정의 데이터 형식에 규칙을 바인딩할 수 있습니다. CREATE TABLE은 사용자 정의 데이터 형식이 정의된 열에 자동으로 규칙을 바인딩합니다. 하지만ALTER COLUMN은 열 데이터 형식을 변경할 때 규칙을 언바인딩하지 않으므로 원래 사용자 정의 데이터 형식에 바인딩된 규칙이 해당 열에 그대로 바인딩됩니다. ALTER COLUMN으로 열 데이터 형식을 변경한 후, 사용자 정의 데이터 형식에서 규칙을 언바인딩하는 sp_unbindrule을 실행해도 이미 데이터 형식이 변경된 열에는 규칙이 그대로 남습니다. 즉, ALTER COLUMN이 열 데이터 형식을 규칙에 바인딩된 사용자 정의 데이터 형식으로 변경해도 새 데이터 형식에 바인딩된 규칙이 열에 바인딩되지 않습니다.

사용 권한

ALTER TABLE은 sysadmin 고정 서버 역할 및 db_ownerdb_ddladmin 고정 데이터베이스 역할 및 테이블 소유자에 대한 권한 기본값이며 양도할 수 없습니다.

예제
A. 새 열을 추가하도록 테이블 변경

다음 예제는 null 값을 허용하고 DEFAULT 정의를 통해 제공된 값이 없는 열을 추가합니다. 각 행은 새 열에 NULL을 가집니다.

CREATE TABLE doc_exa ( column_a INT) GO ALTER TABLE doc_exa ADD column_b VARCHAR(20) NULL GO EXEC sp_help doc_exa GO DROP TABLE doc_exa GO
B. 열을 삭제하도록 테이블 변경

다음 예제는 열을 삭제하도록 테이블을 수정합니다.

CREATE TABLE doc_exb ( column_a INT, column_b VARCHAR(20) NULL) GO ALTER TABLE doc_exb DROP COLUMN column_b GO EXEC sp_help doc_exb GO DROP TABLE doc_exb GO
C. 제약 조건이 있는 열을 추가하도록 테이블 변경

다음 예제는 UNIQUE 제약 조건이 있는 새 열을 추가합니다.

CREATE TABLE doc_exc ( column_a INT) GO ALTER TABLE doc_exc ADD column_b VARCHAR(20) NULL CONSTRAINT exb_unique UNIQUE GO EXEC sp_help doc_exc GO DROP TABLE doc_exc GO
D. 검사되지 않은 제약 조건을 추가하도록 테이블 변경

다음 예제는 테이블의 기존 열에 제약 조건을 추가합니다. 이 열에는 제약 조건을 위반하는 값이 있으므로 기존 행에 대해 유효성 검사를 하지 않고 제약 조건을 추가하도록 WITH NOCHECK을 사용해야 합니다.

CREATE TABLE doc_exd ( column_a INT) GO INSERT INTO doc_exd VALUES (-1) GO ALTER TABLE doc_exd WITH NOCHECK ADD CONSTRAINT exd_check CHECK (column_a > 1) GO EXEC sp_help doc_exd GO DROP TABLE doc_exd GO
E. 제약 조건이 있는 여러 열을 추가하도록 테이블 변경

다음 예제는 제약 조건이 정의된 여러 열을 새로 추가합니다. 첫 번째 새 열은 IDENTITY 속성이 있으므로 테이블의 각 행은 ID 열에 새로운 증가 값을 가집니다.

CREATE TABLE doc_exe ( column_a INT CONSTRAINT column_a_un UNIQUE) GO ALTER TABLE doc_exe ADD /* Add a PRIMARY KEY identity column. */ column_b INT IDENTITY CONSTRAINT column_b_pk PRIMARY KEY, /* Add a column referencing another column in the same table. */ column_c INT NULL CONSTRAINT column_c_fk REFERENCES doc_exe(column_a), /* Add a column with a constraint to enforce that */ /* nonnull data is in a valid phone number format. */ column_d VARCHAR(16) NULL CONSTRAINT column_d_chk CHECK (column_d IS NULL OR column_d LIKE "[0-9][0-9][0-9]-[0-9][0-9][0-9][0-9]" OR column_d LIKE "([0-9][0-9][0-9]) [0-9][0-9][0-9]-[0-9][0-9][0-9][0-9]"), /* Add a nonnull column with a default. */ column_e DECIMAL(3,3) CONSTRAINT column_e_default DEFAULT .081 GO EXEC sp_help doc_exe GO DROP TABLE doc_exe GO
F. 기본값이 있는 Null 허용 열 추가

다음 예제는 DEFAULT 정의가 있는 null 허용 열을 추가하고 WITH VALUES를 사용하여 테이블의 각 기존 행에 대한 값을 제공합니다. WITH VALUES를 사용하지 않으면 각 행이 새 열에 NULL 값을 가집니다.

ALTER TABLE MyTable ADD AddDate smalldatetime NULL CONSTRAINT AddDateDflt DEFAULT getdate() WITH VALUES
G. 제약 조건 해제 및 재설정

다음 예제는 데이터에 허용되는 급여를 제한하는 제약 조건을 해제합니다. ALTER TABLE에 WITH NOCHECK CONSTRAINT를 사용하면 제약 조건이 해제되어 해당 제약 조건을 위반하는 데이터를 삽입할 수 있습니다. WITH CHECK CONSTRAINT는 제약 조건을 다시 설정합니다.

CREATE TABLE cnst_example (id INT NOT NULL, name VARCHAR(10) NOT NULL, salary MONEY NOT NULL CONSTRAINT salary_cap CHECK (salary < 100000) ) -- Valid inserts INSERT INTO cnst_example VALUES (1,"Joe Brown",65000) INSERT INTO cnst_example VALUES (2,"Mary Smith",75000) -- This insert violates the constraint. INSERT INTO cnst_example VALUES (3,"Pat Jones",105000) -- Disable the constraint and try again. ALTER TABLE cnst_example NOCHECK CONSTRAINT salary_cap INSERT INTO cnst_example VALUES (3,"Pat Jones",105000) -- Reenable the constraint and try another insert, will fail. ALTER TABLE cnst_example CHECK CONSTRAINT salary_cap INSERT INTO cnst_example VALUES (4,"Eric James",110000)
H. 트리거 해제 및 재설정

다음 예제는 ALTER TABLE의 DISABLE TRIGGER 옵션을 사용하여 트리거를 해제하고 트리거를 위반하는 데이터를 삽입할 수 있도록 합니다. ENABLE TRIGGER를 사용하여 트리거를 다시 설정할 수 있습니다.

CREATE TABLE trig_example (id INT, name VARCHAR(10), salary MONEY) go -- Create the trigger. CREATE TRIGGER trig1 ON trig_example FOR INSERT as IF (SELECT COUNT(*) FROM INSERTED WHERE salary > 100000) > 0 BEGIN print "TRIG1 Error: you attempted to insert a salary > $100,000" ROLLBACK TRANSACTION END GO -- Attempt an insert that violates the trigger. INSERT INTO trig_example VALUES (1,"Pat Smith",100001) GO -- Disable the trigger. ALTER TABLE trig_example DISABLE TRIGGER trig1 GO -- Attempt an insert that would normally violate the trigger INSERT INTO trig_example VALUES (2,"Chuck Jones",100001) GO -- Re-enable the trigger. ALTER TABLE trig_example ENABLE TRIGGER trig1 GO -- Attempt an insert that violates the trigger. INSERT INTO trig_example VALUES (3,"Mary Booth",100001) GO
예제)













ALTER TABLE MET_EVENT_POST ADD PRIMARY KEY NONCLUSTERED (EVPID)