1. 컬럼 속성(무결성 제약조건)
-- not null
CREATE TABLE null_test(
col1 varchar2(20) NOT NULL,
col2 varchar2(20) NULL,
col3 varchar2(20)
);
INSERT INTO NULL_TEST nt (col1, col2)
VALUES ('aa', 'bb');
-- 오류 발생. ORA-01400: cannot insert NULL into ("HR"."NULL_TEST"."COL1")
INSERT INTO NULL_TEST nt (col2, col3)
VALUES ('cc', 'dd');
INSERT INTO NULL_TEST nt (col1, col3)
VALUES ('cc', 'dd');
-- unique
CREATE TABLE unique_test(
col1 varchar2(20) UNIQUE NOT NULL,
col2 varchar2(20) UNIQUE,
col3 varchar2(20) NOT NULL,
col4 varchar2(20) NOT NULL,
CONSTRAINT temp_unique unique(col3, col4)
);
INSERT INTO UNIQUE_TEST ut (col1, col2, col3, col4)
VALUES ('aa', 'bb', 'cc', 'dd');
INSERT INTO UNIQUE_TEST ut (col1, col2, col3, col4)
VALUES ('aa2', 'bb2', 'cc2', 'dd2');
INSERT INTO UNIQUE_TEST ut (col1, col2, col3, col4)
VALUES ('aa3', '', 'cc3', 'dd3');
-- 오류 ORA-00001: unique constraint (HR.SYS_C007003) violated
UPDATE UNIQUE_TEST
SET col1 = 'aa'
WHERE col2 = 'bb2';
-- unique 제약으로 들어가는 컬럼들은 그들의 조합이 유일해야 한다.
-- 각 컬럼의 데이터의 유일함은 의미가 없고, 조합이 유일해야 한다.
CREATE TABLE UNIQUE_TEST2(
col1 varchar2(20),
col2 varchar2(20),
CONSTRAINTS temp_unique2 unique(col1, col2)
);
INSERT INTO UNIQUE_TEST2 ut (col1, col2)
VALUES ('aa', 'aa');
INSERT INTO UNIQUE_TEST2 ut (col1, col2)
VALUES ('aa', 'aa2');
INSERT INTO UNIQUE_TEST2 ut (col1, col2)
VALUES ('aa2', 'aa');
INSERT INTO UNIQUE_TEST2 ut (col1, col2)
VALUES ('aa3', 'aa');
-- check
CREATE TABLE check_test(
gender varchar2(10) NOT NULL
CONSTRAINT check_gender CHECK(gender IN('M', 'F'))
);
INSERT INTO CHECK_TEST ct VALUES ('M');
INSERT INTO CHECK_TEST ct VALUES ('F');
--오류 : ORA-02290: check constraint (HR.CHECK_GENDER) violated
INSERT INTO CHECK_TEST ct VALUES ('남');
INSERT INTO CHECK_TEST ct VALUES ('여');
1-1. 기본키(Primary Key)
1-2. 기본키 선언 방법
create table pkTest(
col1 varchar2(10) primary key,
col2 varchar2(10)
constraints pk_name primary key(col2)
);
-- 기본키(Primary Key)
CREATE TABLE primary_test(
student_id number(10) PRIMARY KEY,
name varchar2(20)
);
CREATE TABLE primary_test2(
student_id number(10),
name varchar2(20),
CONSTRAINT student_pk PRIMARY KEY (student_id)
);
1-3. Foreign Key(외래키)
1-4. FK 선언 방법
create table pTable(
p_pk number primary key
);
create table cTable(
c_pk number primary key,
p_pk number,
constraint fk_name foreign key (p_pk)
references pTable(p_pk) on delete cascade
);
1-5. 삭제 옵션
on delete cascade
-> 참조되는 부모 테이블의 행에 대한 delete를 허용한다.
-> 즉, 참조되는 부모 테이블 값이 삭제되면 연쇄적으로 자식 테이블값 역시 삭제된다.
on delete set null
-> 참조되는 부모 테이블의 행에 대한 delete를 허용한다.
-> 이건 cascade와 다르게 부모 테이블의 값이 삭제되면 참조하는 자식 테이블의 값들은 null값으로 설정된다.
CREATE TABLE daddy(
idx NUMBER ,
mid NUMBER PRIMARY KEY
);
CREATE TABLE daughter(
idx NUMBER PRIMARY KEY ,
mid NUMBER,
CONSTRAINTS fk_da FOREIGN KEY (mid)
REFERENCES DADDY(mid) ON DELETE CASCADE
);
INSERT INTO DADDY d VALUES (1, 10);
INSERT INTO DADDY d VALUES (2, 20);
SELECT * FROM DADDY d ;
-- ORA-02291: integrity constraint (HR.FK_DA) violated - parent key not found
INSERT INTO DAUGHTER d VALUES (100, 10);
INSERT INTO DAUGHTER d VALUES (101, 10);
INSERT INTO DAUGHTER d VALUES (102, 10);
INSERT INTO DAUGHTER d VALUES (200, 20);
INSERT INTO DAUGHTER d VALUES (201, 20);
INSERT INTO DAUGHTER d VALUES (202, 20);
DELETE FROM DADDY d WHERE idx = 1;
CREATE TABLE daughter2(
idx NUMBER PRIMARY KEY ,
mid NUMBER,
CONSTRAINTS fk2_da FOREIGN KEY (mid)
REFERENCES DADDY(mid) ON DELETE SET NULL
);
INSERT INTO DAUGHTER2 d VALUES (200, 20);
INSERT INTO DAUGHTER2 d VALUES (201, 20);
INSERT INTO DAUGHTER2 d VALUES (202, 20);
SELECT * FROM DAUGHTER2 d ;
DELETE FROM DADDY d WHERE idx = 2;