-- 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가지 조건이 요구된다.