27. 제약조건

hanahana·2022년 7월 30일
0

Oracle - 학원수강

목록 보기
8/11
post-thumbnail

primery key

  • 테이블에서 한 행의 정보를 구분하기 위한 고유 식별자(Identifier) 역할을 한다.
  • 기호는 p
  • NOT NULL과 UNIQUE의 의미를 둘 다 가지고 있으며, 한 테이블당 한 개만 설정 가능
CREATE TABLE USER_PRIMARYKEY(
USER_NO NUMBER PRIMARY KEY,
USER_ID VARCHAR2(20) UNIQUE,
USER_PWD VARCHAR2(30) NOT NULL,
USER_NAME VARCHAR2(30),
GENDER VARCHAR2(10),
PHONE VARCHAR2(30),
EMAIL VARCHAR2(50)
);
  • 첫번재 칼럼에 primary key를 제약조건으로 넣었다.
insert into user_primarykey
values(1,'user01','pass01','일용자','남','010111111','user01@naver.com');
--실행가능

insert into user_primarykey
values(1,'user02','pass02','이용자','여','010000100','user02@naver.com');
--프라이머리키의 중복으로 오류
오류 보고 -
ORA-00001: unique constraint (KH.SYS_C007067) violated

insert into user_primarykey
values(2,'user02','pass02','이용자','여','0100000000','user02@naver.com');
--null을 프라이머리키에 넣어서 오류
오류 보고 -
ORA-01400: cannot insert NULL into ("KH"."USER_PRIMARYKEY"."USER_NO")
  • 프라이머리키 2개 이상 설정하기
create table pirmarykey2(
user_no number,
user_id varchar2(20),
primary key(user_no, user_id)
);
  • 컬럼레벨에서 설정하지 않고 컬럼 선언 뒤에 프라이머리키를 괄호로 따로 선언하면 여러개의 프라이머리키가 가능하다
  • 이 테이블은 user_id와 user_no 2개의 프라이머리키가 있는 테이블이 되었다

UNIQUE

유니크 즉 고유값이다
유일한 값만 들어가도록 하고 싶을 때 사용합니다. 즉 중복을 허용하지 않는것이죠
그리고 당연히NOT NULL과 함께 사용할 수 있습니다.

FOREIGN KEY

  • 참조 무결성을 유지하기 위한 제약 조건
  • 참조된 다른 테이블이 부모테이블이 제공되는 값만 사용할 수 있도록 제한을 거는 것
  • 기호는 R
  • 자식 테이블 해당 컬럼 값은 참조되는 부모 테이블의 컬럼 값 중의 하나와 일치하거나 null을 가질 수 있음
create table shop_member(
user_no number unique,
user_id varchar(20) primary key,
user_pwd varchar(30) not null,
user_name varchar2(30),
gender char(1),
phone varchar2(20),
email varchar2(30)
);

create table shop_buy(
buy_no number primary key,
user_id varchar2(20) references shop_member(user_id),
proucdt_name varchar2(20),
reg_date date default sysdate);
  • shop buy 테이블의 user_id가 shop_memeber 테이블의 user_id를 레퍼런스 하고있다
insert into shop_member 
values(1,'user01','pass01','일용자','M','0100000000','user01@iei.or.kr');
insert into shop_member 
values(2,'user02','pass02','이용자','F','0110000000','user02@iei.or.kr');
insert into shop_member 
values(3,'user03','pass03','삼용자','M','0120000000','user01@iei.or.kr');

--유저 3명추가

insert into shop_buy
values(1,'user01','축구화',default);
insert into shop_buy
values(2,'user02','농구화',default);
insert into shop_buy
values(3,'user03','족구화',default);

--정상 추가 가능

insert into shop_buy
values(4,'user04','피구화',default);

--shop_member에 없는 user이기 때문에 등록오류
오류 보고 -
ORA-02291: integrity constraint (KH.SYS_C007074) violated - parent key not found
  • 레퍼런스된 자료의 삭제
delete from shop_member
where user_id = 'user01';

-- 레퍼런스 하고 있는 user01일 삭제하는 명령어
-- 오류로 삭제 불가
--오류 보고 -
ORA-02292: integrity constraint (KH.SYS_C007074) violated - child record found
  • 자식 테이블인 shop_by에서 사용하고있는 user01은 지울수 없다는 오류메세지가 나온다
  • 삭제하려면 자식테이블 → 부모테이블 이라는 과정이 필요하다
DELETE FROM SHOP_BuY
WHERE USER_ID = 'user01';
--1

delete from shop_member
where user_id = 'user01';
--2

하지만 만약, user_id의 전체 내용을 삭제하고 싶지 않다면….

- on delete set null

  • user_id의 자료만 남기고 id만 삭제하는 방법을 생각해보자!
create table shop_buy(
buy_no number primary key,
user_id varchar2(20) references shop_memeber(user_id) **on delete set null**,
proucdt_name varchar2(20),
reg_date date default sysdate
);
  • 테이블을 생성할때 레퍼런스가 된 컬럼에 on delete set null을 함께 선언해준다
  • 이제 부모 테이블 (shop_member)에서 user01을 삭제해보자
delete from shop_member
where user_id = 'user01';

select * from shop_buy;
--shop_buy 출력

---------출력결과
1	null  	축구화	22/07/19
2	user02	농구화	22/07/19
3	user03	족구화	22/07/19
  • 삭제된 유저가 null로 나타나는것을 확인할수있다.

부모테이블에서 삭제하면 자식테이블에서도 삭제되게한다

on delete cascade

  • 생성시 선언해주면 부모테이블 삭제시 저절로 자식테이블의 자료도 함께 삭제된다
  • (*관계된 모든 행이 삭제되니 주의!)
create table shop_buy(
buy_no number primary key,
user_id varchar2(20) references shop_memeber(user_id) **on delete cascade**,
proucdt_name varchar2(20),
reg_date date default sysdate
);

제약조건에 이름 붙이기

create table shop_buy(
buy_no number **CONSTRAINT** buy_no_pk primary key ,
user_id varchar2(20) references shop_member(user_id) on delete cascade,
proucdt_name varchar2(20),
reg_date date default sysdate
);
  • 칼럼이름 자료형 CONSTRAINT 제약조건이름 제약조건
    • 이 방식으로 설정하면 제약조건에 이름을 붙여 편하게 관리할수있다 Untitled

alter를 이용한 제약조건 추가 수정 이름변경 해보기

  • 제약조건 수정은 삭제 후 추가 한다
create table shop_member(
user_no number, --unique
user_id varchar(30), --primary key
user_pwd varchar(40), --not null
phone varchar2(20),
email varchar2(50)
);
  • 제약조건을 주석대로 추가해보자
alter table shop_member
add constraint pk_user_id primary key(user_id);

alter table shop_member
add constraint uno_user_no unique(user_no);

alter table shop_member
modify user_pwd not null;
  • 제약조건 삭제하기
alter table employee_copy
drop constraint SYS_C007049;

--제약조건 이름을 입력하면 제약조건이 전부 삭제된다.
  • primary key, foreign key , default 추가하기
create table shop_buy(
buy_no number,  --p
user_id varchar2(20), --r
product_name varchar2(50),
reg_date date); --default sysdate

alter table shop_buy 
add constraint pk_buy_no primary key(buy_no);

alter table shop_buy
add constraint r_user_id_shop_member 
foreign key (user_id) references shop_member(user_id);

alter table shop_buy
modify reg_date default sysdate;

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

--제약조건 활상화/비활성화
alter table shop_buy enable constraint r_user_id_shop_member;
--활성화
--alter table 테이블이름 enable constraint 컨스랜트이름;

alter table shop_buy disable constraint r_user_id_shop_member;
--비활성화
--alter table 테이블이름 disable constraint 컨스랜트이름;
  • 활성화
    • alter table 테이블이름 enable constraint 컨스랜트이름;
  • 비활성화
    • alter table 테이블이름 disable constraint 컨스랜트이름;

컬럼 수정하기

alter table employee_copy add emp_name1 varchar2(40);
--컬럼추가

alter table employee_copy modify emp_name1 number;
--컬럼 수정

alter table employee_copy drop column emp_name1;
--컬럼 삭제

alter table shop_buy 
rename column user_id to new_user_id; 

--컬럼 이름 변경
profile
hello world

0개의 댓글