본문 바로가기
Infra & Security Eng/Database Engineering

제약 조건 관리 추가 삭제와 비활성화 명령어와 해설

by 엔지니어 E 2026. 2. 10.
반응형

기존 테이블 파일 sales.sql이 있는 상태이고, 이 파일에서 제약 조건만 있는 파일 constraints.sql 을 만들어 실습 하려 한다 

 

제약 조건 추가 삭제

ALTER TABLE 테이블 
ADD CONSTRAINT 제약 조건 이름 제약_조건_타입; ---> 제약 조건을 추가함
* ADD는 NOT NULL 이 적용이 안됨 ---> modify로 제약 조건 NOT NULL 지정이 가능함 

ALTER TABLE 테이블 
MODIFY 컬럼 CONSTRAINT 제약 조건 이름 NOT NULL;
* MODIFY로 제약 조건 NOT NULL 지정이 가능함 

ALTER TABLE 테이블 
DROP PRIMARY KEY | UNIQUE(컬럼) | CONSTRAINT 제약 조건 이름 [CASCADE];

* 제약 조건 이름을 반드시 만들어놔야 제약 조건 추가, 삭제가 가능
* Foreign Key는 Primary Key와 Unique Key 둘 다 참조 가능
* PK(Primary Key)나 UK(Unique Key)는 삭제시에 참조 중인 FK(Foreign Key) 를 먼저 삭제 해야 한다

 

제약 조건 활성화 비활성화

ALTER TABLE 테이블
ENABLE CONSTRAINT 제약_조건;

ALTER TABLE 테이블 
DISABLE CONSTRAINT 제약_조건 [CASCADE] 

 

제약조건만 삭제 하기 명령어와 해설

1.  자식 테이블(전표상세)은 부모를 참조하므로 연결 고리(FK)부터 가장 먼저 삭제
ALTER TABLE "전표상세" DROP CONSTRAINT "전표상세_전표번호_FK"; -- 부모(판매전표)와의 연결을 끊기 위함
ALTER TABLE "전표상세" DROP CONSTRAINT "전표상세_제품번호_FK"; -- 부모(제품)와의 연결을 끊기 위함
ALTER TABLE "전표상세" DROP CONSTRAINT "전표상세_PK";          -- 두 컬럼을 묶은 고유 식별 규칙 삭제
ALTER TABLE "전표상세" DROP CONSTRAINT "전표상세_금액_CK";     -- 데이터 값 범위 제한 규칙 삭제
ALTER TABLE "전표상세" DROP CONSTRAINT "전표상세_수량_NN";     -- 필수 입력 규칙 삭제
ALTER TABLE "전표상세" DROP CONSTRAINT "전표상세_단가_NN";     -- 필수 입력 규칙 삭제
ALTER TABLE "전표상세" DROP CONSTRAINT "전표상세_금액_NN";     -- 필수 입력 규칙 삭제

ALER TABLE "전표상세"라는 이름의 테이블을 수정하기 시작한다
DROP CONSTRAINT 이 테이블에 걸려 있는 여러 규칙 중 하나를 선택해서 제거 한다


2. 자식과의 연결이 끊겼으므로 이제 부모 테이블(판매전표)의 제약 조건을 안전하게 삭제
ALTER TABLE "판매전표" DROP CONSTRAINT "판매전표_전표번호_PK"; -- 식별자 규칙 삭제 (참조하는 자식이 없어야 삭제 가능)
ALTER TABLE "판매전표" DROP CONSTRAINT "판매전표_총액_CK";     -- 값 검증 규칙 삭제
ALTER TABLE "판매전표" DROP CONSTRAINT "판매전표_판매일자_NN"; -- 필수 입력 규칙 삭제
ALTER TABLE "판매전표" DROP CONSTRAINT "판매전표_고객명_NN";   -- 필수 입력 규칙 삭제
ALTER TABLE "판매전표" DROP CONSTRAINT "판매전표_총액_NN";     -- 필수 입력 규칙 삭제

3. 또 다른 부모 테이블(제품)의 제약 조건을 삭제
ALTER TABLE "제품" DROP CONSTRAINT "제품_제품번호_PK";        -- 식별자 규칙 삭제
ALTER TABLE "제품" DROP CONSTRAINT "제품_제품명_UK";          -- 중복 방지 규칙 삭제
ALTER TABLE "제품" DROP CONSTRAINT "제품_제품단가_CK";        -- 값 검증 규칙 삭제

 

제약 조건 삭제 한거 확인하기 

SELECT table_name, constraint_name, constraint_type
FROM user_constraints
WHERE table_name IN ('제품', '판매전표', '전표상세')
ORDER BY table_name;

---> 선택된 레코드가 없습니다 라고 나와야 함

 

제약 조건 다시 추가하기 (실습: 기존 테이블 파일 sales.sql과 제약조건 파일 constraints.sql)

ALTER TABLE "제품" ADD CONSTRAINT "제품_제품번호_PK" PRIMARY KEY ("제품번호");
ALTER TABLE "제품" ADD CONSTRAINT "제품_제품명_UK" UNIQUE ("제품명");
ALTER TABLE "제품" ADD CONSTRAINT "제품_제품단가_CK" CHECK ("제품단가" > 0);

ALTER TABLE "판매전표" ADD CONSTRAINT "판매전표_전표번호_PK" PRIMARY KEY ("전표번호");
ALTER TABLE "판매전표" ADD CONSTRAINT "판매전표_총액_CK" CHECK ("총액" > 0);
ALTER TABLE "판매전표" MODIFY "판매일자" CONSTRAINT "판매전표_판매일자_NN" NOT NULL;
* 기존에 ALTER TABLE "판매전표" DROP CONSTRAINT "판매전표_판매일자_NN" 위에서 이 이름의 규칙을 삭제 했었다. 이제 "판매일자"칸은 일시적으로 빈 값(NULL)을 넣어도 오라클이 막지 않는 상태가 된다 
그래서 위에서 MODIFY로 판매일자라는 기존 칸의 성질을 수정하여 NOT NULL 규칙을 입혀야 한다
그 결과 다시 "판매일자" 칸은 빈 값을 허용하지 않는 필수 입력 상태가 된다

ALTER TABLE "판매전표" MODIFY "고객명" CONSTRAINT "판매전표_고객명_NN" NOT NULL;
ALTER TABLE "판매전표" MODIFY "총액" CONSTRAINT "판매전표_총액_NN" NOT NULL;

ALTER TABLE "전표상세" ADD CONSTRAINT "전표상세_PK" PRIMARY KEY ("전표번호", "제품번호");
ALTER TABLE "전표상세" ADD CONSTRAINT "전표상세_전표번호_FK" FOREIGN KEY ("전표번호") REFERENCES "판매전표" ("전표번호");
ALTER TABLE "전표상세" ADD CONSTRAINT "전표상세_제품번호_FK" FOREIGN KEY ("제품번호") REFERENCES "제품" ("제품번호");
ALTER TABLE "전표상세" ADD CONSTRAINT "전표상세_금액_CK" CHECK ("금액" > 0);
ALTER TABLE "전표상세" MODIFY "수량" CONSTRAINT "전표상세_수량_NN" NOT NULL;
ALTER TABLE "전표상세" MODIFY "단가" CONSTRAINT "전표상세_단가_NN" NOT NULL;
ALTER TABLE "전표상세" MODIFY "금액" CONSTRAINT "전표상세_금액_NN" NOT NULL;

 

기존 테이블 파일(sales.sql)에 제약조건 파일 입히기

1. @sales 실행
2. @constraints 실행 --> ALTER TABLE 문들이 실행돼서 PK,FK,CHECK 규칙이 테이블에 입혀짐 
3. DESC 제품 또는 DESC 판매전표로 확인하기