반응형

| 기존 테이블 파일 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 판매전표로 확인하기 |
'Infra & Security Eng > Database Engineering' 카테고리의 다른 글
| SQL 인덱스의 정의, 종류, 특징, 생성, 삭제, 외래키 관련 정리 (0) | 2026.02.11 |
|---|---|
| SQL 테이블 지우고 명령어로 확인하는 프로세스 (0) | 2026.02.11 |
| [Oracle] 제약 조건(UK, CHECK, NOT NULL) 완벽 정리와 실습 (0) | 2026.02.10 |
| 공장(Factory) 테이블 제약조건 실습하기 (0) | 2026.02.10 |
| SQL 기존 테이블 삭제, 새 테이블 생성 관련 (실습) (@sc.sql) (0) | 2026.02.09 |