SQL Server default 제약조건(constraint) 추가, 변경, 제거
SQL Server2019. 2. 9. 06:56
데이터베이스를 관리하다보면 기존테이블에 디폴트 값을 할당하거나 새로운 칼럼울 추가하면서 디폴트값을 지정해야 하는경우가 있다. 하지만 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; -- 원하는 새로운 값을 가진 제약조건을 추가한다.
'SQL Server' 카테고리의 다른 글
SQL Server 테이블 데이터 중복제거 방법 (0) | 2019.02.09 |
---|---|
SQL Server 조인(join) 을 이용한 데이터 업데이트 방법 (0) | 2019.02.09 |
SQL Server 에서 무작위로 (random) 데이터를 가져오는 방법 (0) | 2019.02.09 |
SQL Server CTE 를 이용한 INSERT, UPDATE, DELETE, 재귀쿼리 예제 (0) | 2019.02.08 |
SQL Server 에서 mysql 의 group_concat 과 같은 효과 내기 (0) | 2019.02.08 |