ㅇ
지금까지 생성한 테이블들은 문제가 있는 테이블이야
데이터가 중복될 수 있어.
쌤이 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테이블이 이거 참조할 수 있겠지?!!