Tip & Tech

데이터베이스를 관리하다보면 기존테이블에 디폴트 값을 할당하거나 새로운 칼럼울 추가하면서 디폴트값을 지정해야 하는경우가 있다. 하지만 default 제약조건을 추가하는 경우가 많지 않아 구문을 외우는게 쉽지 않다. 근 20년을 SQL Server 를 관리 하지만 아직도 default 제약 조건을 추가할때는 구문을 찾아보고 하고있다.
Default 제약조건을 추가하는 여러가지 방법에 대해 알아보자


구문

 
ALTER TABLE {TABLENAME} ADD {COLUMNNAME} {TYPE} {NULL|NOT NULL} CONSTRAINT {CONSTRAINT_NAME} DEFAULT {DEFAULT_VALUE} WITH VALUES
 


실제 적용예

칼럼을 추가하며 default 값을 지정할때

 
ALTER TABLE test ADD col1 varchar(20) NULL --또는 NOT NULL. 

CONSTRAINT dft_test_col1 -- 이름을 생략하면 자동으로 생성된다. 

DEFAULT ('not checked') -- default 값 지정 옵션

WITH VALUES -- 기존에 입력된 데이터에 default 값을 업데이트 하고자 하는 경우.
 
  • with values 를 지정하면 칼럼 설정이 nullable 이든 not nullable 이든 기존 레코드에도 default 값을 업데이트한다
  • 추가 칼럼이 nullable 이고 with values 를 지정하지 않으면 기존 레코드에는 영향이 없고 default 제약조건 추가후 입력되는 레코드에 대해서만 default 값이 할당된다.
  • 추가칼럼이 not nullable 일경우 with values 설정을 지정하지 않아도 기존 레코드에도 default 값으로 업데이트 한다.
대용량 테이블의경우 with values 를 칼럼생성과 동시에 지정해야 하는지는 꼭 확인해야 한다. 실제 테이블의 데이터를 변경해야 하는 과정이 포함되기 때문에 해당 테이블에 락이 걸려 사용하지 못하는 경우가 생길수 있다.

나 같은 경우 아래와 같은 방법을 사용한다.

 
ALTER TABLE test ADD col1 varchar(20) NULL

CONSTRAINT dft_test_col1

DEFAULT ('not checked');


WHILE 1=1
BEGIN
	UPDATE top (3000) test SET col1='gg' WHERE col1 is null
	IF @@rowcount > 0 CONTINUE
	ELSE BREAK
END;


ALTER TABLE test ALTER COLUMN col1 varchar(20) NOT NULL;
 



Default 제약조건에 이름을 부여하지 않고 가장 단순하게 default 값을 지정할때

 
ALTER TABLE test ADD col1 int NOT NULL DEFAULT(1) 
 



이미 생성돼 있는 칼럼에 default 값을 지정할때

 
ALTER TABLE test ADD col3 datetime null;

ALTER TABLE test ADD CONSTRAINT df_col3_getdate DEFAULT getdate() FOR col3;
 



기존에 default 값을 가지고 있는 칼럼의 default 칼럼을 변경하고자 할때

ALTER TABLE test ADD col3 datetime null DEFAULT(1) 이와 같은 구문울 보면 default 절이 칼럼의 정의 인것처럼 보이지만 default 는 사실 제약조건을 추가하는 것이다. 따라서 기존 default 값을 변경하고자 하면 기존 제약조건을 삭제하고 새로운 제약조건을 추가하는 방법을 사용하여야 한다.


EXEC SP_HELP test -- 할당된 제약조건 이름을 확인한 후

ALTER TABLE test DROP CONSTRAINT DF___test__x__5D3B11F9 ; -- 기존 default 제약조건을 삭제

ALTER TABLE _temp ADD CONSTRAINT DF_temp_x default 2 FOR col1; -- 원하는 새로운 값을 가진 제약조건을 추가한다.