row_id 행이 저장되어 있는 물리적인 위치
row_num 내가 읽어드리는 행의 개수(풀 테이블스캔할 때 주로 사용한다.)
행을 읽는 방법은 2가지 밖에 없다.
full table scan → 테이블의 행을 처음부터 끝까지 읽는 것.(행을 전부 읽는 것(block단위로 읽는다.))
index scan → pk를 복사해서 정렬을 해둔다. index scan이 더 빠르다.
제약조건 2
UK, NOT NULL, CHECK
UK(Unique Key), NOT NULL 설정
ㄴ 중복 안되게 해 주는 거. ㄴ 돈과 관련된 컬럼들
CREATE TABLE 테이블 (
.....
CONSTRAINT 제약_조건 UNIQUE (컬럼));
CREATE TABLE 테이블 (
컬럼 데이터_타입 CONSTRAINT 제약_조건 NOT NULL,
......;
CREATE TABLE 테이블(
컬럼데이터_타입 CONSTRAINT 제약_조건 UNIQUE,
.....;
‐ UK는 고유인덱스가 만들어진다.
‐ NOT NOLL 컬럼레벨에서 만정의 할 수 있다.
CHECK 설정
CREATE TABLE 테이블 (
.....
CONSTRAINT 제약_조건 CHECK (조건));
또는
CREATE TABLE 테이블(
컬럼데이터_타입 CONSTRAINT 제약_조건 CHECK(조건),
...;
‐ 행에 입력될 데이터의 조건을 정의한다.
‐ 조건은 WHERE절에 기술하는 조건형식과 동 일하다.
‐ NOT NULL은 CHECK 제약 조건으로 간주된다.
. CHECK (컬럼 ISNOTNULL)
• CHECK와 NOT NULL 제약 조건내용검색
SELECT constraint_name, search_condition FROM user_constraints
WHERE table_name = '테이블';
제약조건추가삭제
emp, dept 테이블 간의 관계가 있는데 제약조건이 맞지 않는 걸 어떻게 찾지?
SELECT DISTINCT dno FROM emp
MINUS
SELECT dno FROM dept;
===================================
ALTER TABLE 테이블
ADD CONSTRAINT 제약_조건 제약_조건_타입;
ALTER TABLE 테이블
MODIFY 컬럼 CONSTRAINT 제약_조건 NOT NULL; → not null은 그냥 모디파이해야 한다.
ALTER TABLE 테이블 DROP PRIMARY KEY | UNIQUE(컬럼) | CONSTRAINT 제약_조건 [CASCADE];
포랜키, 프라이머리키도 지워버린다. ┘
‐ NOT NULL을제외하고모두 ADD 명령으로 제약조건을 추가한다.
‐ NOT NULL은 MODIFY 명령으로 추가한다.
‐PK나 UK는 삭제 시에 참조 중인 FK를 먼저 삭제해야 한다.
. CASCADE를 이용할 수 있다.
‐ 제약조건은'CREATE TABLE '명령이 아니라'ALTERTABLE ~' 통해서 설정하는 것이 작업에 유리하다.
제약조건활성화비활성화
ALTER TABLE 테이블
ENABLE CONSTRAINT 제약_조건;
ALTER TABLE 테이블
DISABLE CONSTRAINT 제약_조건 [CASCADE]
ㄴ 참조하는 포랜키도 비활성화해준다.
‐ PK와 UK가 ENABLE/DISABLE 될 때 인덱스도 생성/삭제된다.
‐ PK와 UK가 DISABLE 되려면 참조하는 FK가지워지거나비활성화되어야 한다.
. CASCADE 옵션을 이용할 수 있다.
제약조건삭제
• class와 st에 추가된 제약조건을 모두 삭제한다.
SQL> ALTER TABLE st
2 DROP PRIMARY KEY;
SQL> ALTER TABLE st
2 DROP CONSTRAINT st_cno_fk;
SQL> ALTER TABLE class
2 DROP PRIMARY KEY;
SQL> ALTER TABLE class
2 DROP CONSTRAINT class_cname_uk;
ㄴ 이름으로 삭제
SQL> ALTER TABLE class
2 DROP CONSTRAINT class_cname_nu;
‐ 삭제순서에 주의한다.
제약조건비활성화
• 제약조건의 상태를 확인하고 비활성화/활성화한다.
SQL> SELECT table_name, constraint_name, status
2 FROM user_constraints
3 WHERE table_name IN ('CLASS', 'ST');
SQL> ALTER TABLE st
2 DISABLE CONSTRAINT st_sno_pk;
SQL> INSERT INTO st (sno, sname) values ('10', '조조');
SQL> INSERT INTO st (sno, sname) values ('10', '유비');
SQL> SELECT * FROM st;
삭제는 자식부터
만들 때는 부모부터