*.제약조건.
- 목적 :
- NOT NULL : 해당 컬럼값으로 NULL허용하지않음
- UNIQUE : 테이블내 컬럼값은 유일한값.
- PRIMARY KEY : 테이즐내 기준이 될수있는 컬럼값 -> entity를 대표/업무활용도/키값
- FOREIGN KEY : 해당컬럼값이 다른 컬럼값 참조해야함.
- CHECK : 저장데이터 값의범위나 조건 지정
 check(조건) ~
-- 회원번호를 추가로 저장
mno number(5)

-- 제약조건
create table 테이블명
(
컬럼 컬럼크기 [컬럼레벨:CONSTRAINT 제약조건명 [primay key | not null | unique | check(~)]] | [default]
[테이블레벨:CONSTRAINT 제약조건명 컬럼타입(컬럼명)]
)

--회원번호(pk),id(nn), 비밀번호, 이름(nn), 주민번호(uk), 전화번호, 등록일, 지역(ck)
create table member2
(
mno number(5) primary key
, id varchar2(10) not null
, pwd varchar2(5)
, mname varchar2(10) not null
, ssn char(14) unique
, tel varchar2(14)
, loc varchar(10) check(loc in ('서울','인천','부천','포천','제주'))
);

--
insert into member2
values (1,'aa','123','홍길동','801123-1234567',null,'울산');
--ORA-02290: 체크 제약조건(SUPER.SYS_C003028)이 위배되었습니다

insert into member2
values (1,'aa','123','홍길동','801123-1234567',null,'제주');


insert into member2
values (2,'bb','222','김연아','801123-1234567',null,'포천');
--ORA-00001: 무결성 제약 조건(SUPER.SYS_C003030)에 위배됩니다

insert into member2
values (2,'bb','222','김연아','901123-1234567',null,'포천');


insert into member2
values (3,'cc','333','','911123-1234567',null,'부천');
--ORA-01400: NULL을 ("SUPER"."MEMBER2"."MNAME") 안에 삽입할 수 없습니다

insert into member2
values (3,'cc','','김현중','911123-1234567',null,'부천');


insert into member2
values (3,'dd','123','원빈','791123-1234567',null,'인천');
--ORA-00001: 무결성 제약 조건(SUPER.SYS_C003029)에 위배됩니다

insert into member2
values (4,'dd','123','원빈','791123-1234567',null,'인천');

*.제약조건 조회
select constraint_name, constraint_type, table_name
from user_constraints;

-- member3
create table member3
(
mno number(5) constraint mem3_mno_pk primary key
, id varchar2(10) constraint mem3_id_nn not null
, pwd varchar2(5)
, mname varchar2(10) constraint mem3_mname_nn not null
, ssn char(14) constraint mem3_ssn_uk unique
, tel varchar2(14)
, loc varchar(10) constraint mem3_loc_ck check(loc in ('서울','인천','부천','포천','제주'))
);

-- 조회
select constraint_name, constraint_type, table_name
from user_constraints
where table_name='MEMBER3';

create table member4
(
mno number(5) constraint mem4_mno_pk primary key
, id varchar2(10) constraint mem4_id_nn not null
, pwd varchar2(5) default '1004'
, mname varchar2(10) constraint mem4_mname_nn not null
, ssn char(14) constraint mem4_ssn_uk unique
, tel varchar2(14)
, loc varchar(10) constraint mem4_loc_ck check(loc in ('서울','인천','부천','포천','제주'))
);

insert into member4
values (2,'bb',null,'자기야','791223-1234567',null,'인천');

insert into member4
values (1,'aa','','자기야','791123-1234567',null,'인천');

       MNO ID         PWD   MNAME      SSN            TEL            LOC
---------- ---------- ----- ---------- -------------- -------------- ----------
         2 bb               자기야     791223-1234567                인천
         1 aa               자기야     791123-1234567                인천

insert into member4 (mno,id,mname,ssn,loc)
values (3,'cc','저기야','791113-1234567','서울');

       MNO ID         PWD   MNAME      SSN            TEL            LOC
---------- ---------- ----- ---------- -------------- -------------- ----------
         2 bb               자기야     791223-1234567                인천
         1 aa               자기야     791123-1234567                인천
         3 cc         1004  저기야     791113-1234567                서울

--단점 : 테이블레벨에서는 not null 정의 할수 없다.
--장점 : 제약조건 여러개 추가.
--테이블레벨 제약조건있는 member5 작성
--id에 unique제약조건 추가.
create table member5
(
mno number(5)
, id varchar2(10) constraint mem5_id_nn not null
, mname varchar2(10) constraint mem5_mname_nn not null
, ssn char(14)
, loc varchar(10)
, constraint mem5_mno_pk primary key(mno)
, constraint mem5_id_uk unique(id)
, constraint mem5_ssn_uk unique(ssn)
, constraint mem5_loc_ck check(loc in ('서울','인천','부천','포천','제주'))
);

*.제약조건 constraint
-목적 : DB관련 편리성 확보 -> DB무결성확보
-primary key : not null + unique -> entity를 대표(업무활용높은것)

*.계약조건조회
select constraint_name, constraint_type, table_name
from user_constraints

*.table생성
-제약조건 X
  ->제약조건 추가,삭제
alter table 테이블명
 - add 컬럼명 constraint 제약조건명 제약조건
 - drop 제약조건명
 - modify(유일하게 not null에서 사용) 컬럼명 constraint 제약조건명 제약조건

-제약조건 O(제약조건이름X) 생성
create table 테이블명
(
컬럼명 데이터타입(크기),
컬럼명 데이터타입(크기) default 기본값
)
-제약조건 O(제약조건이름O) 생성
create table 테이블명
(
컬럼명 데이터타입(크기)
constraint 제약조건명 제약조건,
)

create table 테이블명
(
컬럼명 데이터타입(크기),
컬럼명 데이터타입(크기),
제약조건 constraint 제약조건명 제약조건(컬럼명)
)

--jobinfo 테이블생성 제약조건은 추후에 추가
--job_id varchar2(10) -> pk
--job_title varchar2(20) -> nn
create table jobinfo
(
job_id varchar2(10)
,job_title varchar2(20)
)

alter table jobinfo
add constraint jobinfo_pk primary key(job_id)

--emp2 테이블생성 제약조건은 추후에 추가
--empno number(5) -> pk
--ename varchar2(10) -> nn
--job_id varchar2(10) -> fk
create table emp2
(
empno number(5)
,ename varchar2(10)
,job_id varchar2(10)
)

--fk제약조건
--alter tale 테이블명
-- add [contraint 제약조건이름] foreign key(컬럼명) references 상위테이블(상위컬럼명)

alter table emp2
add constraint emp2_pk primary key(empno)
add constraint emp2_fk foreign key(job_id) references jobinfo(job_id)


alter table emp2
modify ename constraint emp2_nn not null

alter table jobinfo
modify job_title constraint jobinfo_nn not null

============================
*.constraint와 DML
--
상태 : 부모(jobinfo) / 자식(emp2)
insert : O / 부모 키값의 존재여부
update : 자식 키값의 존재여부 / 부모 키값의 존재여부
delete : 자식 키값의 존재여부 / O
--
desc jobinfo
desc emp2

insert into jobinfo
values('AD_PRES','President');
insert into jobinfo
values('AD_VP','Admin Vice President');
insert into jobinfo
values('AD_ASST','Admin Assistant');
insert into jobinfo
values('FI_MGR','Finance Manager');
insert into jobinfo
values('FI_ACCOUNT','Accountant');

insert into emp2
values(100,'스티븐','AD_PRES','');

insert into emp2
values(101,'니나','AD_VP','');

insert into emp2
values(111,'렉스','FI_MGR');

insert into emp2
values(112,'다니엘','FI_ACCOUNT');

--emp2의 다니엘의 empno를 120으로 수정
update emp2
set empno=120 where ename='다니엘';

--emp2의 다이넬의 job_id를 AD_ASST로 수정.
update emp2
set job_id='AD_ASST' where ename='다니엘';

--다니엘의 job_id를 it_pg로 수정
update emp2
set job_id='IT_PG' where ename='다니엘';

ORA-02291: 무결성 제약조건(SUPER.EMP2_FK)이 위배되었습니다- 부모 키가 없습니다

--FI_MGR컬럼값을 FI_MG로 수정
update jobinfo
set job_id='FI_MG' where job_id='FI_MGR';

ORA-02292: 무결성 제약조건(SUPER.EMP2_FK)이 위배되었습니다- 자식 레코드가 발견되었습니다

--FI_ACC컬럼값을 FI_ACCOUNT로 수정
update jobinfo
set job_id='FI_ACCOUNT' where job_id='FI_ACC';

--jobinfo테이블에서 fi_acc삭제
delete from jobinfo
where job_id='FI_ACCOUNT'

--jobinfo테이블에서 fi_mgr삭제
delete from jobinfo
where job_id='FI_MGR'
ORA-02292: 무결성 제약조건(SUPER.EMP2_FK)이 위배되었습니다- 자식 레코드가 발견되었습니다

--emp2테이블에서 '다니엘' 삭제
delete from emp2
where ename='다니엘'

--emp2테이블에서 '렉스' 삭제
delete from emp2
where ename='렉스'


 

Posted by 말없제이
,