[ORACLE] DDL(2)(제약조건)

sleeee·2023년 5월 7일
0

SQL

목록 보기
11/19

제약조건⭐⭐⭐

  • 테이블의 해당 컬럼에 잘못된 값이 입력/변경/삭제되는 것을 방지하기 위해 설정되는 조건(무결성 제약조건)
  • 결함이 없는 데이터를 관리하기 위함

1. PRIMARY KEY (기본키)

  • 하나의 테이블에 하나만 존재하며 각 행을 식별하기 위한 용도로 사용
  • NULL값을 허용하지 않고 중복값을 허용안함(NOT NULL + UNIQUE KEY)

2. FOREIGN KEY (외래키,참조키)

  • 부모테이블의 특정 컬럼(기본키)를 참조하는 컬럼
  • 부모테이블에 참조하는 값이 없으면 오류가 발생한다.

3. UNIQUE KEY(유일키)

  • 컬럼의 모든 값이 유일해야 하는 경우에 사용. 중복데이터를 허용하지 않음
  • NULL은 허용됨

4. CHECK 제약조건

  • 조건에 맞는 데이터만 입력되도록 조건을 부여하는 제약조건

5. NOT NULL 조건

  • NULL값을 허용하지 않는 컬럼에 설정

예시

예1) 제약조건에 이름을 부여하지 않은 경우

	CREATE TABLE DEPT1
	(
		DEPTNO NUMBER(2) PRIMARY KEY,
		DNAME VARCHAR2(15),
		LOC CHAR(9) CHECK(LOC IN('서울','부산'))
	);

	SELECT * FROM USER_CONSTRAINTS; -- 데이터딕셔너리
	SELECT TABLE_NAME,CONSTRAINT_NAME FROM USER_CONSTRAINTS;

	INSERT INTO DEPT1 VALUES(10,'영업부','서울');

	SQL> INSERT INTO DEPT1 VALUES(11,'인사부','제주');
    -- 체크제약조건이 맞지 않음
	INSERT INTO DEPT1 VALUES(11,'인사부','제주')
	*
	1행에 오류:
	ORA-02290: 체크 제약조건(C##SCOTT.SYS_C0011265)이 위배되었습니다

예2) 제약조건에 이름을 부여하기 - 컬럼레벨과 테이블레벨이 있다.

        -- 컬럼레벨
	CREATE TABLE DEPT2
	(
		DEPTNO NUMBER(2) CONSTRAINT PK_DEPT2_DEPTNO PRIMARY KEY,
		DNAME VARCHAR2(15) DEFAULT '개발부',
		LOC VARCHAR2(15)
	);
	-- 테이블레벨
	CREATE TABLE EMP2
	(
		EMPNO NUMBER(4),
		ENAME VARCHAR2(15) CONSTRAINT NN_NAME NOT NULL,
		DEPTNO NUMBER(2),
		CONSTRAINT PK_EMP2_EMPNO PRIMARY KEY(EMPNO),
		CONSTRAINT FK_EMP2_DEPTNO FOREIGN KEY(DEPTNO) REFERENCES DEPT2(DEPTNO) 
	);
	- DEPT2/EMP2 테이블에 데이터를 각각 추가해 보세요
	  INSERT INTO DEPT2 VALUES(13,'부서1','강남');
	  INSERT INTO DEPT2(DEPTNO,LOC) VALUES(14,'송파');
      -- DNAME컬럼은 DEFAULT로 설정된 '개발부'가 등록됨
          SELECT * FROM DEPT2;

예3) 두 개이상의 컬럼이 PK로 설정된다면 테이블레벨로 설정해야 한다.

	CREATE TABLE MYSTUDENT
	(
		STUNUM NUMBER(5), -- 학생번호
		TERM VARCHAR2(5), -- 학기
		SCORE NUMBER(3), -- 점수
		CONSTRAINT PK_STUDENT PRIMARY KEY(STUNUM,TERM) 
        -- 두개의 컬럼을 PK로 지정함(복합키)
	);

	INSERT INTO MYSTUDENT VALUES(1,'1-1',100);
	INSERT INTO MYSTUDENT VALUES(1,'1-2',80);
	INSERT INTO MYSTUDENT VALUES(2,'1-1',90);
	INSERT INTO MYSTUDENT VALUES(2,'1-2',70);

	INSERT INTO MYSTUDENT VALUES(1,'1-2',70); 
    -- PK가 중복된값을 갖게 되므로 오류
	오류 보고 -
	ORA-00001: 무결성 제약 조건(C##SCOTT.PK_STUDENT)에 위배됩니다

예4)

	CREATE TABLE DEPT3
	(
		DEPTNO NUMBER(3) CONSTRAINT PK_DEPT3 PRIMARY KEY,
		DNAME VARCHAR2(10),
		LOC VARCHAR2(10),
		CONSTRAINT UN_DEPT3 UNIQUE(DNAME) 
	);
       
	INSERT INTO DEPT3 VALUES(10,'영업부','서울');
        INSERT INTO DEPT3 VALUES(11,'영업부','부산'); 
        -- 유니크제약조건 위배됨

	오류 보고 -
	ORA-00001: 무결성 제약 조건(C##SCOTT.UN_DEPT3)에 위배됩니다

2) 제약조건 삭제/추가

# 제약조건 삭제
: ALTER TABLE 테이블명 DROP CONSTRAINT 제약조건명;
예1) ALTER TABLE DEPT3 DROP CONSTRAINT PK_DEPT3;

# 제약조건 추가
: ALTER TABLE 테이블명 ADD CONSTRAINT 제약조건명 제약조건(컬럼명);
예2) ALTER TABLE DEPT3 ADD CONSTRAINT PK_DEPT3 PRIMARY KEY(DEPTNO);

profile
개인 공부 기록 👩‍💻

0개의 댓글