-- 1. SITE TABLE 생성
-------------------------------------------------------------------------------------------------
CREATE TABLE SITE
( SITE_ID VARCHAR2(10) NOT NULL
, SITE_NAME VARCHAR2(10) NULL);

-- ALTER TABLE SITE ADD CONSTRAINT AK_SITE UNIQUE (SITE_ID); // UNIQUE 제약조건을 걸어도 참조가능하다. NULL값이 있는 컬럼에도 가능하다.
-- Primary key 제약을 걸든, Unique 제약을 걸든 Unique 조건이 필요하면 자동적으로 Unique Index가 자동 생성된다.

ALTER TABLE SITE ADD CONSTRAINT PK_SITE PRIMARY KEY (SITE_ID);  
table SITE이(가) 변경되었습니다.

INSERT INTO SITE VALUES ('A', 'A site');
COMMIT;
SELECT * FROM SITE;

SITE_ID    SITE_NAME
---------- ----------
A          A site     




-- 2. MENU TABLE 생성
-------------------------------------------------------------------------------------------------
CREATE TABLE MENU
( MENU_ID VARCHAR2(10) NOT NULL
, MENU_NAME VARCHAR2(10) NULL
, SITE_ID VARCHAR2(10) NOT NULL);

ALTER TABLE MENU ADD CONSTRAINT PK_MENU PRIMARY KEY (MENU_ID);
table MENU이(가) 변경되었습니다.

ALTER TABLE MENU ADD CONSTRAINT FK_MENU FOREIGN KEY(SITE_ID) REFERENCES SITE(SITE_ID);
table MENU이(가) 변경되었습니다.

INSERT INTO MENU VALUES ('M01', 'menu', 'A');
COMMIT;
SELECT * FROM MENU;
MENU_ID    MENU_NAME  SITE_ID  
---------- ---------- ----------
M01        menu       A          



INSERT INTO MENU VALUES ('M02', 'menu', 'B');
오류 보고:
SQL 오류: ORA-02291: integrity constraint (SJ_USER.FK_MENU) violated - parent key not found
02291. 00000 - "integrity constraint (%s.%s) violated - parent key not found"
*Cause:    A foreign key value has no matching primary key value.
*Action:   Delete the foreign key or add a matching primary key.


ALTER TABLE MENU MODIFY CONSTRAINT FK_MENU DISABLE;
table MENU이(가) 변경되었습니다.

INSERT INTO MENU VALUES ('M02', 'menu', 'B');
COMMIT;
SELECT * FROM MENU;
MENU_ID    MENU_NAME  SITE_ID  
---------- ---------- ----------
M01        menu       A          
M02        menu       B          


ALTER TABLE MENU MODIFY CONSTRAINT FK_MENU ENABLE;
오류 보고:
SQL 오류: ORA-02298: cannot validate (SJ_USER.FK_MENU) - parent keys not found
02298. 00000 - "cannot validate (%s.%s) - parent keys not found"
*Cause:    an alter table validating constraint failed because the table has
           child records.
*Action:   Obvious


DELETE FROM MENU WHERE MENU_ID = 'M02';
COMMIT;
ALTER TABLE MENU MODIFY CONSTRAINT FK_MENU ENABLE;
table MENU이(가) 변경되었습니다.


ALTER TABLE MENU MODIFY CONSTRAINT FK_MENU DISABLE;
table MENU이(가) 변경되었습니다.

DROP TABLE SITE;
오류 보고:
SQL 오류: ORA-02449: unique/primary keys in table referenced by foreign keys
02449. 00000 -  "unique/primary keys in table referenced by foreign keys"
*Cause:    An attempt was made to drop a table with unique or
           primary keys referenced by foreign keys in another table.
*Action:   Before performing the above operations the table, drop the
           foreign key constraints in other tables. You can see what
           constraints are referencing a table by issuing the following
           command:
           SELECT * FROM USER_CONSTRAINTS WHERE TABLE_NAME = "tabnam";


ALTER TABLE MENU DROP CONSTRAINT FK_MENU;
table MENU이(가) 변경되었습니다.

DROP TABLE SITE;
table SITE이(가) 삭제되었습니다.

DROP TABLE MENU;
table MENU이(가) 삭제되었습니다.

 

* UNIQUE 제약조건은 대상 컬럼에 NULL을 제외한 값들이 Unique해야 한다.  대상 컬럼이 하나 일경우 NULL값을 제외한 값들이 UNIQUE하면 된다. (ORACLE)

- 대상 컬럼이 둘일 경우
------------------------------------------------------------------------
CREATE TABLE TEST
(ID1 VARCHAR2(10)
,ID2 VARCHAR2(10)
,TTL VARCHAR2(100));

--ALTER TABLE TEST DROP CONSTRAINT TEST_UK;
ALTER TABLE TEST ADD CONSTRAINT TEST_UK UNIQUE (ID1, ID2);


INSERT INTO TEST VALUES ('1', '1', 'AAAA');
INSERT INTO TEST VALUES ('2', NULL, 'AAAA');
INSERT INTO TEST VALUES ('3', '2', 'AAAA');
INSERT INTO TEST VALUES ('4', '3', 'AAAA');
INSERT INTO TEST VALUES (NULL, NULL, 'AAAA');   -- 정상
INSERT INTO TEST VALUES (NULL, NULL, 'AAAA');   -- 정상
INSERT INTO TEST VALUES ('5', NULL, 'AAAA');    -- 정상
INSERT INTO TEST VALUES ('5', NULL, 'AAAA');    -- 무결성 제약 조건 위배 발생
INSERT INTO TEST VALUES (NULL, '5', 'AAAA');    -- 정상
COMMIT;

* 참고
Oracle은 unique constraint가 걸려 있는 컬럼의 NULL은 중복대상여부가 아니나 SQLSERVER는 NULL도 중복으로 있어서는 않된다. 에러 발생한다. (SQLSERVER)

- 대상 컬럼이 둘일 경우
------------------------------------------------------------------------
CREATE TABLE TEST
(ID1 VARCHAR(10)
,ID2 VARCHAR(10)
,TTL VARCHAR(100));

--ALTER TABLE TEST DROP CONSTRAINT TEST_UK;
ALTER TABLE TEST ADD CONSTRAINT TEST_UK UNIQUE (ID1, ID2);


INSERT INTO TEST VALUES ('1', '1', 'AAAA');
INSERT INTO TEST VALUES ('2', NULL, 'AAAA');
INSERT INTO TEST VALUES ('3', '2', 'AAAA');
INSERT INTO TEST VALUES ('4', '3', 'AAAA');
INSERT INTO TEST VALUES (NULL, NULL, 'AAAA');   -- 정상
INSERT INTO TEST VALUES (NULL, NULL, 'AAAA');   -- 무결성 제약 조건 위배 발생
INSERT INTO TEST VALUES ('5', NULL, 'AAAA');    -- 정상
INSERT INTO TEST VALUES ('5', NULL, 'AAAA');    -- 무결성 제약 조건 위배 발생
INSERT INTO TEST VALUES (NULL, '5', 'AAAA');    -- 정상
COMMIT;

 

Primary Key Constraints는 NOT NULL, Unique, Minimal Set의 3가지 조건이 요구되나,
Unique Constraints는 Unique, Minimal Set 2가지 조건이 요구된다.