5월 27일 목요일 (13일차) - 제약조건

@_@·2021년 5월 27일

Database

목록 보기
33/39


지금까지 생성한 테이블들은 문제가 있는 테이블이야

데이터가 중복될 수 있어.
쌤이 2번 인서트 했더니
DEPTNO DNAME                        LOC


        10 ITCENTER                    1700
20 ADMIN                        1800
10 ITCENTER                    1700
20 ADMIN                        1800
이렇게 됐었어. 즉, 중복이 허용되어 있어. 무결성이 깨진 테이블이야


이제부터는 테이블의 무결성을 보장하는 방법

ㅇ10장 405페이지 제약조건

무결성 = 결점이 없다
이걸 보장하기 위해 키라는 형태로 컬럼에 제약조건을 설치
컬럼에 조건에 맞는 데이터들만 저장하겠다.

가장 이상적인 테이블은
테이블 당 컬럼 1개에 하나의 프라이머리 키가 지정되어 있는 테이블
컬럼 10개 있어도 그 중 1개의 컬럼에 1개의 프라이머리키 지정
이 부분을 고려 많이 해..

ㅇ407페이지
제악조건은 종속된 테이블의 삭제를 방지합니다- 포린키 이야기
제약조건 설명이 문장 다시듣기

ㅇ유효한 제약 조건 유형
낫널 : 반드시 값이 있어야 한다
유니크 : 중복을 허용하지 않겠다
프라이머리키 : 유니크 + 낫널
포린키 : 참조키, 외래키. 다른 테이블의 값을 참조. 관계 설정을 위해 사용
아무값이나 참조할 수 없어. pk나 uk로 지정된 컬럼만 참조 가능
체크 : 사용자 정의 조건
예) 샐러리가 0보다 커야한다
조건에 맞는 값만 저장하겠다.
이 5개 제약조건 엄~청 중요해!!!!!

이 모든 제약조건은 컬럼별로 설치해
하나의 컬럼에 한개의 제약조건만 설치해야 한다? NO! 낫널과 유케이 2개 할 수 있어

학번과 주민번호 중에
학번은 PK , 주민번호는 낫널 +유케이(2개 제약조건 줄 수 있어)


제약 조건 지침
이름 지정. 생략 가능 오라클 서버가 SYS_001, SYS_002~이라는 기본적으로 지정되긴 해
수많은 제약조건 모니터링, 관리 하려면 이름 있는 게 좋겠지?!
특히 디비의 네이밍은 직관적으로 이해할 수 있는 걸 사용해야 효과 좋아
즉, 이름을 지정한다라고 생각해!

생성시기
테이블 생성될 때 CREATE 명령어로 같이 생성할 수 있고 - 현업에서는 이 방법을 써
생성된 후에는 ALTER테이블로 추가할 수 있어

제약조건들 데이터딕셔너리에 저장되어 있어


이제 생성해보자

ㅇ 같이 생성하는 방법

CREATE TABLE dept
(did number(5),
dname varchar2(10),
여기까지는 컬럼의 구조를 나열한거야 --> 컬럼 선언부

테이블 생성도 자바에서 메인 ?? 어쩌고 저쩌고 ㅠㅍ

컬럼 선언부에서는 컬럼의 이름, 데이터타입, 길이를 선언한다.

그 다음 제약조건 선언부가 따로 있다고 생각. ,로 연결

항상 컨스트레인트 라는 명령어 따라다녀

스크린샷                a                            pk                            cc
comstraint 제약조건이름 제약조건유형(제약조건을 설치할 컬럼)
제약조건설치하겠다.
a라는 이름을 가진 pk라는 제약조건을 cc라는 컬럼에 설치 하겠다

이름은 아무거나 쓸 수 있지만
현업에서 약속처럼 쓰는 방법 : tablecol제약조건
이름만 보고 쉽게 판단할 수 있도록

CREATE TABLE dept
(did number(5),
dname varchar2(10), 여기까지가 컬럼 선언부. 컴마로 제약조건과 구분
constraint dept_did_pk primary key(did)
)

나머지 다섯개 제약조건이 이 룰을 벗어나지 않아.
프라이머리키 이부분만 바뀌면 돼 - 포린키, 유니크 이런식으로

테이블 레벨에서 선언하는 방법 - 지금 했던거
컬럼이름이 뒤에 명시되어 있는
가독성 측면, 편집 측면에서 이게 좋아

그런데, 제약조건 이름을 명시하는데 (컨센트레이트 데피) 여기는 한 몸이야. 이걸 생략할 수 있어
그러면 sys로 이름 알아서 만들어지는거야
이 방법 쓰지말고 꼭 이름 선언해!!


컬럼 레벨에서 선언하는 방법
컬럼 레벨에서 같이 선언
CREATE TABLE dept
(did number(5)  constraint dept_did_pk primary key,
dname varchar2(10)
)
/

컬럼레벨 :전체가 한 문장. 선언과 같이 컬럼과 제약조건을 같이 설치. 컬럼이 앞에 위치
테이블레벨 : 컬럼을 먼저 선언하고, 별도로 제약조건을 선언. 컬럼이 뒤에 위치
될 수 있으면 테이블 레벨로 제약조건 설치하기


<4교시>

ㅇ 앞의 4개(pk, uk, fk, ck체크)의 제약조건은 컬럼레벨, 테이블 레벨 모두에서 선언가능
낫널 제약조건은 컬럼 레벨에서만 선언

현업에서
낫널 제약조건은 컬럼 레벨에서 선언하고
나머지 키 4개는 테이블 레벨에서 선언
이렇게 구분해서 사욯하는 게 대부분이야
~~하는거구나 ~~하는거구나 - 다시 듣기

ㅇ낫널제약조건

널값을 허용하지 않겠다

컬럼 (constraint 제약조건이름) 이게 생략되어 있는거야) NOT NULL
현업 낫널에다가는 제약조건 이름 명시 안해
하이어데이트 데이트 로 뒤에 조건 추가하는 거 - 다시쓱듣기
나머지 제약조건은 전부 이름
그러면 이름이 시스인 제약조건은 낫널이겠구나 할 수 있잖아


유니크제약조건

유니크는 값이 중복되지 않아야 한다는 거니까
이건 널을 허용 해
값만 중복되지 않으면 돼

예) 이메일에는 유니크 UNIQUE 테이블 레벨에서 선언
CONSTRAINT  테이.ㅇ

프라이머리랑 포린키만 키 들어가고
나머지 제약조건에는 KEY라는 단어 들어가지 않아


프라이머리키 제약조건

낫널_유케이
테이블 대표할 수 있는 컬럼에 설치
하나의 컬럼에 한개의 프라이머리키 - 이상적


포린키. 이쪽 벨로그 로그인하느라 놓침 - 다시듣기

포린키는 다른 테이블의 컬럼을 참조해야 하니까
참조할 테이블과 컬럼을 지정해줘야 해
REFERENCE 테이블이름(참조할컬럼이름)


포린키가 특징이 여러가지가 있어

레퍼런스 절만 썼을 때
포린키는 종속적 삭제를 방지해 줘 - 레퍼런스 절만 쓰였을 때 기본 방침

(종속적인 삭제가 일어나도록 해주는 명령어)
레퍼런스 절 다음에
온 딜리트 케스케이드 :  참조하고 있는 행을 같이 삭제 시켜버려
즉 10번 삭제하면 임플로이에서 10번쓰는 사람들 다 삭제돼

온 딜리트 셋널 :  얘도 10은 삭제가 돼
얘는 행이 지워지는 게 아니라 참조 값을 널로 변경

특히 캐스케이드에 주목.
캐스캐이드가 나오면 종속적인 삭제가 일어나겠다 생각해야 해
아주 강력한 명령문이야

ㅇ추가로 알려드리면
드럽 테이블 디파트먼트 케스케이드 : 참조된 테이블까지 같이 삭제

드럽 테이블 디파트먼트 케스케이드 컨스트레인트 : 포린키를 삭제해버려. 관계를 끊어주는 것
그래서 관계가 없으니까 디파트먼트 테이블이 지워져

드랍을 쓸 때는 실행과 동시에 오토커밋 발생하니까 꼬ㅗㄲ꼬꼬꼮ㄲ 신중히 누르기


체크 제약조건

샐러리 문장 예제로 쓰자


이제 실습
내일 디비 수업에 실제로 테이블 생성하기


sql 사용하기 불편했어
실제로 sql+도 코드를 저장해서 재사용 할 수 있어
적극적으로 권장해

파일 만들어서 코드 따로 저장할 수 있어
SQL> select * from departments;
SQL> save test.sql
Created file test.sql

내피시/ 드라이브시(디에있을수도있어)/ 오라클xe./ 앱/.오라클. /프러덕트/.11.2.0/서버 / 빈
내가 저장한 test.sql 메모장으로 열어

.sql 확장자는 스크립트파일 스크립트코드를 저장하는 파일

스크립트 파일은 여러 명령 실행 가능

에디터는 닫아야만 실행 됐었어

이건 안 닫아도 실행 돼. 저장
SQL> @test.sql
그러면 실행 돼

여기서 에디터 열면 마지막 실행된 명령문 하나 실행돼. 버프는 마지막만
여기에 다시 save test1.sql 실행하면 bin폴더에  test1.sql 파일 또 생겨났어

스크립트 만들 때  파일이름.sql
'.sql'이라는 확장자 반드시 있어야 파일이 생성 돼

ㅇ 스크린샷
우리가 메모장 기능 이용할 수 있는 게 2개였어
ed로 실행한 건 버퍼라고 불리우는 메모리야. 가장 마지막에 실행되었던 sql 명령문 1개만 저장. 실행명령어는 / 또는 run
.sql로 만든 파일은 내가 저장하고자 하는 여러개의 sql코드를 저장하는 스크립트 파일. 실행명령어는 @파일이름.sql

ed는 방금 했던 거 수정, 편집할 때
.sql은 여러 코드 동시에 실행


CREATE TABLE a
( a number(3)) ;

INSERT INTO a VALUES (10);
INSERT INTO a VALUES (20);
INSERT INTO a VALUES (30);
INSERT INTO a VALUES (40);
COMMIT;

SELECT * FROM a;
/

구축할 때 대부분 스크립트 파일로 코드 작성해두고 사용해


만약 여기서 한 번 더 실행시킨다면?

ERROR at line 1:
ORA-00955: name is already used by an existing object
테이블 명령문은 에러나고 - 이미 생성되어 있는 테이블이라서
인서트 명령문은 실행

맨 위에 드랍 명령어
drop table a;

CREATE TABLE a
( a number(3)) ;

INSERT INTO a VALUES (10);
INSERT INTO a VALUES (20);
INSERT INTO a VALUES (30);
INSERT INTO a VALUES (40);
COMMIT;

SELECT * FROM a;
/
이렇게 작성이 되어 있어. 드랍에서 시작

모든 명령어 다음에 세미콜론 찍어주기

만약 세미콜론 빠지면 그 문장은 에러나
ERROR at line 2:
ORA-00933: SQL command not properly ended

커밋 다음에 /
/는 버퍼를 한번 더 실행하라는 거야!
아 그래서 나는 테이블이 계속 2개씩 나왔던거야 ㅋㅋㅋㅋㅋㅋㅋㅋㅋ
메모장에는 / 쓰지마

DROP table test cascade constraints;
DROP table test1 cascade constraints;
이거 나열하는 이유 다시듣기

1컬럼선언
CREATE TABLE test
( a number(5),
b number(5),
c number(5),
2제약조건
CREATE TABLE test
( a number(5),
b number(5) not null,
c number(5),
CONSTRAINT test_a_pk PRIMAYR KEY(a)
);

맨 처음
테이블이 없어서 드랍명령어는 에러나

다른 에러 ㅜㅠ
ERROR at line 5:
ORA-00907: missing right parenthesis

DROP table test cascade constraints;
DROP table test1 cascade constraints;

CREATE TABLE test
( a number(5),
b number(5) not null,
c number(5),
CONSTRAINT test_a_pk PRIMAYR KEY(a)
);

CREATE TABLE test1
( d number(5),
e number(5),
f number(5),
a number(5),
CONSTRAINT test1_d_pk PRIMAYR KEY(d),
CONSTRAINT test1_e_uk UNIQUE(d),
CONSTRAINT test1_f_ck CHECK(f IN(0, 1)),
CONSTRAINT test1_a_fk FOREIGN KEY(a)
REFERENCE test(a)
);

ERROR at line 5:
ORA-00907: missing right parenthesis

내가 계속 안됐던이유 ㅠㅠ 레퍼런시스야!! 끝에 s 붙여야 돼
references REFERENCES

내일은 ~~~해보려고 해 - 이거 놓쳤어

test 테이블 먼저 크리에이트 하면 test1테이블이 이거 참조할 수 있겠지?!!

profile
STEP BY STEP

0개의 댓글