[DB_SQL활용] 제약조건

예지성준·2024년 5월 17일

DB

목록 보기
15/19
post-thumbnail

제약 조건

CREATE TABLE 테이블명(
컬럼명 자료형 [제약조건],
...
);

제약 조건의 종류

1. 제약 조건이란?

1) 제약 조건은 테이블의 특정 열에 지정
2) 제약 조건을 지정한 열에 제약 조건에 부합하지 않는 데이터를 저장할 수 없습니다.
3) 제약 조건 지정 방식에 따라 기존 데이터의 수정이나 삭제 가능 여부도 영향을 받습니다.

2. 종류

1) NOT NULL: NULL을 허용하지 않음, 반드시 값을 입력해야 할때(필수항목)

2) UNIQUE: 중복 X, NULL은 중복 허용

3) PRIMARY KEY: 기본키, 중복X, NULL허용 X

4) FOREIGN KEY: 다른 테이블의 기본키를 참조하는 키, 참조 무결성 제약조건
부모 레코드에 자식 레코드가 있는 경우 부모 레코드 삭제 불가

👩‍🏫참고
JOIN시 외래키가 꼭 될 필요는 X, 공통적인 테이블간의 값을 통해서만 조인

5) CHECK: 조건(비교조건...)에 따른 데이터 입력 통제

3. 🌼데이터 무결성이란?

1) 데이터베이스에 저장되는 데이터의 정확성과 일관성을 보장한다는 의미

2) 종류

  • 도메인 무결성 제약조건: 자료형 관련
  • 개체 무결성 제약조건: 기본키와 관련 - 중복 X, NULL 허용X
  • 참조 무결성 제약조건: 외래키와 관련

빈값을 허락하지 않는 NOT NULL

1. 테이블을 생성하며 제약 조건 지정

CREATE TABLE MEMBER(
	USER_ID VARCHAR2(30) NOT NULL,
	USER_PW VARCHAR2(65) NOT NULL,
	USER_NM VARCHAR2(30) NOT NULL,
	MOBILE VARCHAR2(15) 
);

INSERT INTO MEMBER (USER_ID, USER_PW, USER_NM)
	VALUES ('USER01','1234','사용자01');
	
SELECT * FROM MEMBER;

2. 제약 조건 확인

1) USER_CONSTRAINTS 데이터 사전을 활용

SELECT * FROM USER_CONSTRAINTS WHERE TABLE_NAME='MEMBER';

CONSTRAINT_TYPE
C: 일반적인 제약조건, NOT NULL, CHECK
P: Primary Key, 기본키
R: Foreign Key, 외래키
U: Unique

3. 제약 조건 이름 직접 지정

컬럼명 자료형 CONSTRAINT 제약조건명 제약조건

테이블명_컬럼명_제약조건종류

CREATE TABLE MEMBER(
	USER_ID VARCHAR2(30) CONSTRAINT MEM_USER_ID_NN NOT NULL,
	USER_PW VARCHAR2(65) CONSTRAINT MEM_USER_PW_NN NOT NULL,
	USER_NM VARCHAR2(40) CONSTRAINT MEM_USER_NM_NN NOT NULL,
	MOBILE VARCHAR2(15)
);
SELECT * FROM USER_CONSTRAINTS WHERE TABLE_NAME ='MEMBER';

4. 이미 생성한 테이블에 제약 조건 지정

1) NOT NULL 제약 조건의 추가는 ALTER 명령어와 MODIFY 키워드를 사용
ALTER TABLE 테이블명 MODIFY 컬럼명 [자료형][제약조건]

  • 컬럼명(필수)
  • 자료형, 제약조건은 적어도 1개 이상

2) TEL 열에 NOT NULL 제약 조건 추가하기

3) TEL 열 데이터 수정하기

4) NOT NULL 제약조건 추가하기

5. 제약 조건 삭제

  • ALTER 명령어에 DROP CONSTRAINT 키워드를 사용하면 지정한 제약 조건을 삭제할 수 있습니다.

ALTER TABLE 테이블명 DROP CONSTRAINT 제약조건명;

ALTER TABLE MEMBER DROP CONSTRAINT MEM_MOBILE_NN;

중복되지 않는 값 UNIQUE

1. 요약

1) 열에 저장할 데이터의 중복을 허용하지 않고자 할 때 사용
2) NULL은 값이 존재하지 않음을 의미하기 때문에 중복 대상에서는 제외됩니다.
3) UNIQUE 지정 방법은 NOT NULL 제약 조건과 동일합니다.

2. 테이블을 생성하여 제약 조건 지정

CREATE TABLE MEMBER(
	USER_ID VARCHAR2(30) CONSTRAINT MEM_USER_ID_UQ UNIQUE,
	USER_PW VARCHAR2(65),
	MOBILE VARCHAR2(15)
);

3. 제약 조건 확인

4. 중복을 허락하지 않는 UNIQUE

1) TABLE_UNIQUE 테이블에 데이터 중복하여 입력하기

5. UNIQUE 제약 조건과 NULL 값

6. 테이블 생성하며 제약 조건 이름 직접 지정

USER_ID VARCHAR2(30) CONSTRAINT MEM_USER_ID_UQ UNIQUE,

7. 이미 생성한 테이블에 제약 조건 지정

ALTER TABLE 테이블명 MODIFY 컬럼명 CONSTRAINT 제약조건이름 UNIQUE;

8. 제약 조건 삭제

ALTER TABLE 테이블명 DROP CONSTRAINT 제약조건이름;

ALTER TABLE MEMBER DROP CONSTRAINT MEM_USER_ID_UQ;

여러 컬럼 묶어서 제약조건 지정하기


USER_IND_COLUMNS: 인덱스 포함, 제약조건 적용 컬럼 정보

유일하게 하나만 있는 값 PRIMARY KEY

1. 요약

1) UNIQUE와 NOT NULL 제약 조건의 특성을 모두 가지는 제약 조건(데이터 중복을 허용하지 않고 NULL도 허용하지 않습니다.)
2) NULL이 아닌 유일한 값을 가지므로 테이블의 각 행을 식별하는 데 활용
3) PRIMARY KEY 제약 조건은 테이블에 하나밖에 지정할 수 없습니다.
4) PRIMARY KEY로 지정하면 해당 열에는 자동으로 인덱스가 만들어집니다.

2. 테이블을 생성하며 제약 조건 지정하기

1) 테이블을 생성할 때 특정 열에 PRIMARY KEY 설정하기
2) 생성한 PRIMARY KEY 확인하기
3) 생성한 PRIMARY KEY를 통해 자동 생성된 INDEX 확인하기

3. 테이블을 생성하며 제약 조건 이름 직접 지정하기

CREATE TABLE MEMBER(
	USER_ID VARCHAR2(30) CONSTRAINT MEM_USER_ID_PK PRIMARY KEY,
	USER_PW VARCHAR2(65),
	MOBILE VARCHAR2(15),
);
CREATE TABLE MEMBER(
	USER_ID VARCHAR2(30),
	USER_PW VARCHAR2(65),
	MOBILE VARCHAR2(15)
	CONSTRAINT MEM_USER_ID_PW_PK PRIMARY KEY(USER_ID,USER_PW); --여러 컬럼 결합한 기본키
	--USER_ID,USER_PW이 중복X, NULL값 X
);

4. PRIMARY KEY 제약 조건을 지정한 열 확인(중복 값을 입력했을 때)

5. PRIMARY KEY 제약 조건을 지정한 열 확인(NULL 값을 입력했을 때)

6. CREATE문에서 제약 조건을 지정하는 다른 방식

대리키로 기본키를 지정

-- 대리키로 기본키 지정
CREATE SEQUENCE SEQ_MEMBER;

CREATE TABLE MEMBER(
	USER_NO NUMBER(10) PRIMARY KEY,
	USER_ID VARCHAR2(30) UNIQUE NOT NULL, --제약조건 2개 UNIQUE & NOT NULL
	USER_PW VARCHAR2(65) NOT NULL,
	USER_NM VARCHAR2(40) NOT NULL,
	MOBILE VARCHAR2(15)
);
INSERT INTO MEMBER 
	VALUES(SEQ_MEMBER.NEXTVAL, 'USER01','1234','사용자01','010-1111-2222');

다른 테이블과 관계를 맺는 FOREIGN KEY

1. 요약

1) 서로 다른 테이블 간 관계를 정의하는 데 사용하는 제약 조건

2) 특정 테이블에서 PRIMARY KEY 제약 조건을 지정한 열을 다른 테이블의 특정 열에서 참조하겠다는 의미로 지정

2. EMP 테이블과 DEPT 테이블의 제약 조건 살펴보기

외래키 제약조건이 걸려있다.

3. FOREIGN KEY 지정하기

#1.
CREATE TABLE 테이블명{
	...
    컬럼명 자료형 CONSTRAINT 제약조건이름 REFERENCES 참조 테이블(참조할 컬럼)
}
2.
CREATE TABLE 테이블명{
	...
    컬럼명 자료형,
    CONSTRAINT 제약조건이름 FOREIGN KEY(현재테이블의 컬럼명)
    REFERENCES 참조 테이블(참조할 컬럼)
}
CREATE TABLE DEPT_FK AS SELECT * FROM DEPT;

ALTER TABLE DEPT_FK ADD CONSTRAINT DEPT_FK_PK
PRIMARY KEY(DEPTNO);

CREATE TABLE EMP_FK (
	EMPNO NUMBER(4) CONSTRAINT EMP_FK_PK PRIMARY KEY,
	ENAME VARCHAR2(10),
	JOB VARCHAR2(9),
	MGR NUMBER(4),
	HIREDATE DATE,
	SAL NUMBER(7,2),
	COMM NUMBER(7,2),
	DEPTNO NUMBER(2),
	CONSTRAINT EMP_FK_FK 
		FOREIGN KEY(DEPTNO) REFERENCES DEPT_FK(DEPTNO)
	-- DEPTNO NUMBER(2) CONSTRAINT EMP_FK_FK REFERENCES DEPT_FK(DEPTNO)
); 

  • 수정하기
    외래키가 아닌 테이블에 외래키 걸기
ALTER TABLE 테이블명 ADD CONSTRAINT 제약조건이름 FOREGIN KEY(현재 테이블의 컬럼명)
REFERENCES 참조테이블(참조할 컬럼명)

👩‍🏫참고
ALTER TABLE 테이블명 ADD CONSTRAINT 제약조건 이름 PRIMARY KEY(컬럼명, ...);

4. FOREIGN KEY로 참조 행 데이터 삭제하기

ALTER TABLE 테이블명 DROP CONSTRAINT 제약조건명;

ON DELETE

  • NO ACTION: 기본값 -> 부모에 자식 레코드가 있으면 삭제 불가
  • CASCADE: 부모를 삭제하면 자식도 함께 삭제
  • SET NULL: 부모가 삭제되면 자식 레코드의 해당 항목을 NULL로 교체
--제약조건 삭제
ALTER TABLE EMP_FK DROP CONSTRAINT EMP_FK_FK;
ALTER TABLE EMP_FK ADD CONSTRAINT EMP_FK_FK
	FOREIGN KEY(DEPTNO) REFERENCES DEPT_FK(DEPTNO)
	ON DELETE CASCADE;
	--부모가 삭제되면 자식도 연쇄삭제
SELECT * FROM EMP_FK; --외래키가 있는 쪽이 자식 레코드
SELECT * FROM DEPT_FK; -- 기본키가 제공되는 쪽이 부모 레코드

데이터 형태와 범위를 정하는 CHECK

  • 열에 저장할 수 있는 값의 범위 또는 패턴을 정의할 때 사용합니다.
  1. 테이블을 생성할 때 CHECK 제약 조건을 설정하기
  2. CHECK 제약 조건 확인하기

기본값을 정하는 DEFAULT

  1. 테이블을 생성할 때 DEFAULT 제약 조건 설정하기
  2. DEFAULT로 지정한 기본 값이 입력되는 INSERT문 확인하기

제약 조건 비활성화, 활성화

profile
꽁꽁 얼어붙은 한강 위로 😺

0개의 댓글