반응형
제약조건이란?
- 테이블의 컬럼에 원하지 않는 데이터가 입력 / 수정 / 삭제되는 것을 방지하기 위한 조건이다.
- 제약조건의 종속성이 존재하는 경우 테이블의 삭제를 방지한다.
-- 제약조건의 조회는
select * from user_constrains;


0️⃣ 열 레벨 제약조건과 테이블 레벨 제약 조건

1️⃣ create table - 열 레벨 제약 조건

🔸 constraint로 이름을 준것.
-- constraint 직접 이름을 지정할 때 사용 dept_no_pk로 이름을 줬다.
-- check (소괄호 안의 조건)
create table dept2(
dept_no number(2) constraint dept2_no_pk primary key,
dept_name varchar2(15) constraint dept2_name_nn not null,
loca number(4) constraint dept2_loca_locaid_fk REFERENCES locations(location_id),
dept_date date default sysdate,
dept_bonus number(10) default 0,
dept_phone varchar(20) constraint dept2_phone_uk unique,
dept_gender char(1) constraint dept2_gender_ch check(dept_gender in ('M','F'))
);
🔸 constraint를 제거하고 이름없이 제약조건만 준것.
create table dept2(
dept_no number(2) primary key,
dept_name varchar2(15) not null,
loca number(4) REFERENCES locations(location_id),
dept_date date default sysdate,
dept_bonus number(10) default 0,
dept_phone varchar(20) unique,
dept_gender char(1) check(dept_gender in ('M','F'))
);
2️⃣ create table - 테이블 레벨 제약 조건

create table dept2(
dept_no number(2),
dept_name varchar2(15) not null,
loca number(4),
dept_date date default sysdate,
dept_bonus number(10) default 0,
dept_phone varchar(20),
dept_gender char(1),
constraint dept2_no_pk primary key(dept_no/*dept_name*/), -- 슈퍼키
constraint dept2_loca_locaid_fk foreign key(loca) REFERENCES locations(location_id),
constraint dept2_phone_uk unique(dept_phone),
constraint dept2_gender_ch check(dept_gender in ('M','F'))
);
🔸 2개의 컬럼을 묶어서 primary key로 만들기 (참고)

제약조건의 종류
1️⃣ UNIQUE
- 값들이 유일해야한다. 중복값 불가능
- NULL값은 가질 수 있다.

2️⃣ PRIMARY KEY
- NOT NULL + UNIQUE KEY 특징 = PRIMARY KEY
- 값들이 유일하고 중복이 불가능하고 NULL값도 가질 수 없다.

3️⃣ NOT NULL
- NULL값을 가질 수 없다.
- PK는 NOT NULL을 기재하지 않아도 DEFAULT로 NOT NULL이 들어간다.

4️⃣ FOREIGN KEY
- 테이블 간의 관계를 설정한다.
- 어떤 TABLE에 PK를 연동하기 위해서 담아놓은 컬럼을 FK라고 한다.
- 중복값과 NULL값은 사용 가능하다. 그러나 PK에 없는 값은 사용 불가능하다.

5️⃣ CHECK

제약조건을 위배하는 INSERT 시도
🔸 EMPLOYEES TABLE에 제약조건에 위배되는 DATA를 넣어보도록 하겠다.

1️⃣ 개체무결성 위배 (NULL, 중복값은 PK에 들어가지 못한다)
-- ORA-00001: unique constraint (HR.EMP_EMP_ID_PK) violated
---> EMPLOYEE_ID가 이미 있기 때문에 INSERT 할 수 없다.
-- 개체무결성 위배 (NULL, 중복값은 PK에 들어가지 못한다)
INSERT INTO EMPLOYEES(EMPLOYEE_ID, LAST_NAME, EMAIL, HIRE_DATE, JOB_ID)
VALUES(100, 'TEST', 'TEST', SYSDATE, 'TEST');
2️⃣ 참조무결성 위배 (참조하는 TABLE에 PK로 존재해야 FK에 들어갈 수 있다.)
-- ORA-02291: integrity constraint (HR.EMP_JOB_FK) violated - parent key not found
---> DEPARTMENT_ID(PK)에 5번이 없어서 INSERT 할 수 없다.
-- 참조무결성 위배 (참조하는 TABLE에 PK로 존재해야 FK에 들어갈 수 있다.)
INSERT INTO EMPLOYEES(EMPLOYEE_ID, LAST_NAME, EMAIL, HIRE_DATE, JOB_ID, DEPARTMENT_ID)
VALUES(501, 'TEST', 'TEST', SYSDATE, 'TEST', 5);
3️⃣ 도매인 무결성 위배 (컬럼에 정의된 값만 들어갈 수 있다)
-- ORA-02290: check constraint (HR.EMP_SALARY_MIN) violated
---> SALARY 0초과값만 들어갈 수 있으므로 음수값이 들어갈 수 없어서 INSERT 할 수 없다.
-- 도매인 무결성 위배 (컬럼에 정의된 값만 들어갈 수 있다)
INSERT INTO EMPLOYEES(EMPLOYEE_ID, LAST_NAME, EMAIL, HIRE_DATE, JOB_ID, SALARY)
VALUES(501, 'TEST', 'TEST', SYSDATE, 'TEST', -10);
제약조건 관리
제약 조건은 추가 or 삭제는 가능하지만 수정은 불가능하다.
제약 조건의 활성화 or 비활성화도 가능하다.
modify절을 사용하여 not null을 추가 할 수 있다.
0️⃣ 테스트 할 dept2 table을 drop으로 삭제 후 create한다. (기존에 없다면 그냥 create)
DROP TABLE DEPT2;
create table dept2(
dept_no number(2),
dept_name varchar2(15),
loca number(4),
dept_date date default sysdate,
dept_bonus number(10) default 0,
dept_phone varchar(20),
dept_gender char(1)
);
1️⃣ 제약 조건의 추가

- 제약 조건들을 alter구문을 사용하여 아래와 같이 개별로 추가해 줄 수 있다.
--PK 제약조건 추가
ALTER TABLE DEPT2 add constraints dept_no_pk PRIMARY KEY(dept_no);
--FK 제약조건 추가
ALTER TABLE DEPT2 ADD CONSTRAINTS dept_loca_fk FOREIGN KEY(loca) REFERENCES locations(location_id);
--unique 추가
alter table dept2 add constraint dept2_phone_uk unique(dept_phone);
-- check 추가
alter table dept2 add constraint dept2_gender_ch check(dept_gender in ('M','F'));
🔸 modify 절을 사용하여 not null 조건 주기.
-- not null 추가 - 컬럼변경문으로
alter table dept2 modify dept_name varchar(15) not null;
2️⃣ 제약조건 삭제

alter table dept2 drop constraint dept_loca_fk;
연습문제
--------------------------------------------------------------------------------연습문제
--문제 1.
--다음과 같은 테이블을 생성하고 데이터를 insert하세요 (커밋)
--조건) M_NAME 는 가변문자형, 널값을 허용하지 않음
--조건) M_NUM 은 숫자형, 이름(mem_memnum_pk) primary key
--조건) REG_DATE 는 날짜형, 널값을 허용하지 않음, 이름:(mem_regdate_uk) UNIQUE 키
--조건) GENDER 가변문자형
--조건) LOCA 숫자형, 이름:(mem_loca_loc_locid_fk) foreign key – 참조 locations테이블(location_id)
create table test1(
m_num number(3) constraint mem_memnum_pk primary key);
drop table members;
create table members (
m_name varchar2(10) not null,
m_num number(3) constraint mem_memnum_pk primary key,
reg_date date default sysdate not null constraint mem_regdate_uk unique,
gender varchar2(1) check(gender in ('M','F')),
loca number(4) constraint mem_loca_loc_locid_fk REFERENCES locations(location_id)
);
select * from locations; -- loca 참고용
insert into members values('홍길동', 20, sysdate, 'M', 1000);
insert into members values('김민지', 100, sysdate, 'F', 2100);
insert into members values('이지연', 50, sysdate, 'F', 2500);
insert into members values('AAA', 1, '2018-07-01', 'M', 1800);
insert into members values('BBB', 2, '2018-07-02', 'F', 1900);
insert into members values('CCC', 3, '2018-07-03', 'M', 2000);
insert into members values('DDD', 4, sysdate, 'M', 2000);
select * from members order by m_num;
commit;
--문제 2.
--MEMBERS테이블과 LOCATIONS테이블을 INNER JOIN 하고 m_name, m_mum, street_address, location_id
--컬럼만 조회 m_num기준으로 오름차순 조회
select * from members;
select * from locations;
select m.m_name, m.m_num, l.street_address, l.location_id
from members m
inner join locations l
on m.loca = l.location_id order by m_num asc;반응형
'국비지원 > DataBase' 카테고리의 다른 글
| [DB] 12. SEQUENCE & INDEX (0) | 2022.11.16 |
|---|---|
| [DB] 11. 뷰(View) (0) | 2022.11.16 |
| [DB] 9. 트랜잭션(Transaction) & 테이블 생성(CREATE TABLE) (0) | 2022.11.15 |
| [DB] 8. DML (Data Manipulation Language) (0) | 2022.11.15 |
| [DB] 7. 서브 쿼리(sub Query) / 스칼라(Scalar) 서브 쿼리 / 인라인 뷰(Inline View) (0) | 2022.11.11 |