ON DELETE CASCADE :부모 테이블에서 외래 키가 참조하는 primary key나 unique key를 포함한 행을 삭제할 때, 자식 테이블의 외래 키를 포함하는 행도 같이 삭제. USING INDEX: 물리적으로 어디 저장될지 스토리지 지정. NOT DEFERRABLE / DEFERRABLE 전자는 하나의 DML 명령문 처리될 때마다 제약조건 위반 여부 검사로 위반하면 바로 롤백(이게 deffault 값으로, defer_spec 명시 안하면 이렇게 됨). 후자는 트랜잭션 종료시까지 제약조건 검사를 연기.DEFERRABLE 중에서도 INITIALLY IMMEDIATE / INITIALLY DEFERRED: 전자는 DML 명령문 종료될 때마다 제약조건 검사(NOT DEFERRABLE이랑의 차이를 잘은 모르겠음). / 후자는 트랜잭션 끝날 때 한거번에 검사해서, 그동안 위반했던 것들 다 롤백. 후자의 경우 성능 향상을 위해 사용. CREATE TABLE subject (
subno NUMBER(5)
CONSTRAINT subject_no_pk PRIMARY KEY
(subject~는 내가 붙이는 이름, 나중에 찾으려고. pk는 primary key 약자)
(과목 번호를 프라이머리 키로 설정)
(CONSTRAINT 이름 PRIMARY KEY)
DEFERRABLE INITIALLY DEFERRED (deferrable 설정)
(DEFERRABLE immediate/deferred 선택)
USING INDEX TABLESPACE indx,
(USING INDEX 테이블스페이스 이름 지정(경로?)
subname VARCHAR2(20)
CONSTRAINT subject_name_nn NOT NULL,(과목 이름 NOT NULL 설정)
(CONSTRAINT 이름 NOT NULL)
term VARCHAR2(1)
CONSTRAINT subject_term_ck CHECK (term in ('1', '2')), (학기, 범위 설정)
(CONSTRAINT 이름 CHECK (범위. 여기서는 in으로 설정))
type VARCHAR2(1)); (이건 제약 조건 없는 경우)
CREATE TABLE sugang(
studno NUMBER(5)
CONSTRAINT sugang_studno_fk REFERENCES student(studno),
(CONSTRAINT 이름 REFERENCES 부모)
subno NUMBER(5)
CONSTRAINT sugang_subno_fk REFERENCES subject(subno),
regdate DATE,
result NUMBER(3),
CONSTRAINT sugang_pk PRIMARY KEY(studno, subno));
(이건 컬럼 설정 밖의 CONSTRAINT로 테이블 레벨의 제약 조건, 그래서 한거번에 2개의 컬럼에 제약을 걸고 있음)
ALTER TABLE student
ADD CONSTRAINT stud_deptno_fk FOREIGN KEY(deptno) REFERENCES department(deptno)
(ADD CONSTRAINT 이름 FOREIGN KEY(받을 것) REFERENCES(할 것)
일반적으로 이런 ALTER, ADD CONSTRAINT에, 추가할 것에(컬럼 이름)을 더한다
ALTER TABLE student
MODIFY (name CONSTRAINT stud_name_nn NOT NULL);
NOT NULL은 MODIFY로 한다. 만약 NOT NULL에도 이름을 명시하고 싶으면
ALTER TABLE student
MODIFY name VARCHAR2(20) CONSTRAINT 이름 NOT NULL;
이렇게 되어야 한다.
SELECT constraint_name, constraint_type, statUs
FROM user_constraints
WHERE table_name IN ('테이블이름')
SELECT constraint_name
FROM user_cons_columns (칼럼의 경우)
WHERE table_name IN ('테이블 이름')
ALTER TABLE subject
DROP CONSTRAINT subject_term_ck [CASCADE];
여기서 cascade는 삭제되는 칼럼의 reference key가 삭제될 때, 참조하는 칼럼의 foreign key의 제약조건도 함께 삭제
ALTER TABLE sugang
DISABLE CONSTRAINT constraint_name [CASCADE];
ENABLE NOVALIDATE. 후자는 기존 데이터에 대해선 제약조건 적용 안하고, 새로 입력되는 값만 검사.