-
[ SQL ] 무결성 제약조건 (기본키, 고유키, 외래키, NOT NULL, CHECK)PROGRAMMING/SQL 2022. 5. 2. 23:19
하루입니다.
오늘 공부할 것은 무결성 제약조건과 데이터 모델링.
무결성 제약조건
- 무결성의 뜻 : 데이터의 정확성
- 무결성 제약조건의 뜻 : 데이터의 정확성을 위해 테이블에 유효하지 않은 데이터가 입력되는 것을 방지하는 것.
제약조건의 정의
제약조건의 정의는 두 가지 방식으로 할 수 있다.
1. 컬럼 레벨 제약조건 정의
- 굳이 별칭을 붙이는 것은 별칭을 붙이지 않으면 제약조건 이름이 SYS U3359444 이런 식으로 뜬다. 찾기 어려움.
CREATE TABLE 테이블명 ( 컬럼명 데이터타입 [CONSTRAINT 제약조건별칭] 제약조건, 컬럼명 데이터타입 [CONSTRAINT 제약조건별칭] 제약조건, ... );2. 테이블 레벨 제약조건 정의
- 하나 이상의 컬럼을 조합하여 제약조건을 정의할 수 있다.
- NOT NULL 제약조건을 제외한 모든 제약조건을 정의할 수 있다.
- 보통 NOT NULL은 컬럼레벨에서, 나머지는 테이블 레벨에서 한다.
CREATE TABLE 테이블명 ( 컬럼명 데이터타입, 컬럼명 데이터타입, ..., [CONSTRAINT 제약조건별칭] 제약조건 (컬럼명, 컬럼명, ... ) );종류
- NOT NULL
해당 컬럼에 NULL값이 입력되지 못하게 한다.
예를 들어 고객 아이디, 비밀번호, 상품이름, 상품번호, 가격 등.
제약조건 정의 방식
CREATE TABLE users ( user_name varchar2(30) NOT NULL, user_tel varchar2(20) CONSTRAINT user_tel_nn NOT NULL, ... );- UNIQUE (고유키)
고유한 값. 즉 중복되지 않는 값. 하지만 NULL이 들어가는 건 가능하지. 왜냐? NULL은 값이 결정되지 않은 거고, 서로 비교도 되지 않는 값이니까.
한 테이블 안에 여러 개 지정 가능하다.
예를 들어 유저 이메일 같은 거.
CREATE TABLE USER ( user_name varchar2(30), user_tel varchar2(20) CONSTRAINT user_tel_nn NOT NULL, user_email varchar2(200) CONSTRAINT user_email_uk UNIQUE, ... , CONSTRAINT user_tel_uk UNIQUE(user_tel) );코드 설명
user_tel의 NN은 컬럼 레벨에서, UK는 테이블 레벨에서 정의했다
user_email의 UK는 컬럼 레벨에서 정의했다. NULL값이 허용된다.
- PRIMARY KEY (기본키)
테이블의 각 행을 고유하게 식별할 수 있는 값이다.
테이블 전체에서 고유한 값이어야 하며, null값도 허용하지 않는다.
예를 들어 학번, 사번, 과목코드, 송장번호. 시퀀스로 생성한 고유번호를 사용하기도 함.
CREATE TABLE users( user_no number(10) CONSTRANINT user_no_pk PRIMARY KRY, ... ); CREATE TABLE course_registerations ( stud_no number(10), course_no number(5), ..., CONSTRAINT course_regist_pk PRIMARY_KEY(stud_no, course_no) ); -- 이건 뭐냐면 수강신청을 한다 했을 때 (학생번호, 코스번호)가 중복되면 안된다는 거임.- FOREIGN KEY (외래키, 참조키)
해당 컬럼의 값은 다른 혹은 같은 테이블의 특정 컬럼과 관련된 값만 가져와야 한다 = 특정 컬럼 안에 있는 값이어야 한다.
종속 테이블(자식 테이블) : FOREING KEY로 설정된 컬럼은 부모테이블의 기존 값과 일치하거나 NULL이어야 한다.
참조 테이블(부모 테이블) : 자식테이블이 참조하는 부모테이블의 컬럼은 PRIMARY KEY 혹은 UNIQUE 제약조건이 정의된 컬럼이어야 한다.
자식테이블에서 참조하고 있는 부모테이블의 행은 삭제할 수 없다.
예를 들어 직원테이블의 부서ID는 부서테이블의 부서ID를 참조한다. (부서ID는 하나, 그걸 사용하는 직원들은 여러명)
부서테이블의 부서ID행을 삭제하기 위해서는 직원테이블의 부서ID를 우선삭제해야 한다.
CREATE TABLE emps( ... dept_id number(10) CONSTRAINT emp_dept_id_fk REFERENCES depts(dept_id), 외래키 데이터타입 CONSTRAINT 별칭 REFERENCES 테이블명(부모키) ... ); CREATE TABLE emps( ... dept_id number(10), ..., CONSTRAINT emp_dept_id_fk FOREIGN KEY (dept_id) REFERENCES depts(dept_id), CONSTRAINT 별칭 FOREIGN KEY(외래키) REFERENCES 테이블명(부모키) );코드 설명
emps 테이블의 dept_id 컬럼의 값은 depts테이블의 dept_id 값을 참조한다.
REFERENCES 키워드와 참조대상테이블(컬럼명)을 지정한다.- CHECK
제시된 조건을 만족하는 값을 가져야 한다.
타 컬럼과의 비교는 불가하다 (ex. 수정일 컬럼은 생성일 컬럼보다 시간이 뒤에 위치해야 한다 등)
CREATE TABLE products ( ... pro_price number(10) CONSTRAINT pro_price_ck CHECK (pro_price > 0), pro_sell varchar2(20) CONSTRAINT pro_sell_ck CHECK (pro_sell in ('판매중', '재고부족', '절판')), pro_discount number(4, 3) CONSTRAINT pro_discount_ck CHECK (pro_discount >= 0.0 and pro_discount <= 0.5), );코드 설명
상품가격은 0보다 커야 한다.
상품판매상태는 판매중, 재고부족, 절판 중 하나여야 한다.
상품할인률은 0보다 크고 0.5보다 작아야 한다.
잘못된 정보에 대한 지적은 언제나 환영입니다.
복습 끝!
'PROGRAMMING > SQL' 카테고리의 다른 글
[ SQL ] 집합연산자, 상호연관 서브쿼리 (0) 2022.05.10 데이터 모델링(ER다이어그램 ) (0) 2022.05.03 [ SQL ] 오라클 다중행함수(그룹함수) 와 GROUP_BY절 (0) 2022.04.29 [ SQL ] ORACLE의 데이터 타입 (0) 2022.04.28 [ SQL ] JOIN (문제풀이와 포괄조인) (0) 2022.04.28