본문 바로가기

Oracle Database /SQL

SQL 무결성

-- 무결성 제약 조건  
-- PRIMARY KEY : 기본키. NULL을 허용하지 않음, 중복 허용하지않음 
                          ID,주민번호 해당 , not null + 고유키(UNIQUE KEY)


-- UNIQUE KEY : 고유키. NULL 을 허용 , 중복 허용하지않음 
                        EMAIL  , null 허용 + 고유값
-- CHECK 

-- FOREIGN KEY : 외래키. 다른 테이블에서 PRIMARY KEY인 경우 자주 있음. 
                         NULL 을 허용 

-- NOT NULL 


-- NOT NULL  
CREATE TABLE TB_TEST( 
    COL1 VARCHAR2(10) NOT NULL, 
    COL2 VARCHAR2(20) 
); 

INSERT INTO TB_TEST(COL1,COL2) 
VALUES('AAA', 'aaa'); 

INSERT INTO TB_TEST(COL1,COL2) 
VALUES('AAA', ''); 

INSERT INTO TB_TEST(COL1,COL2) 
VALUES('', 'aaa'); -- 무결성 에러 -- 컬럼을 NOT NULL 로 만들어서 에러뜸 

SELECT 
    * 
FROM TB_TEST; 


-- PRIMARY KEY = NOT NULL + UNIQUE 
-- 유일하게 식별 할 수 있는 정의된 규칙  
-- 최대 32개 컬럼까지 지정 가능 -- 대부분 2개씀 
CREATE TABLE TEST_01( 
    KEY_01 VARCHAR2(10) CONSTRAINT PK_TEST_01 PRIMARY KEY, 
    KEY_02 VARCHAR2(10), 
    COL_01 VARCHAR2(20), 
    COL_02 VARCHAR2(20) 
); 

INSERT INTO TEST_01(KEY_01, KEY_02, COL_01, COL_02) 
VALUES('AAA','aaa','111','111'); 

INSERT INTO TEST_01(KEY_01, KEY_02, COL_01, COL_02) 
VALUES('','aaa','111','111'); -- NOT NULL 에러(PRIMARY KEY) 

INSERT INTO TEST_01(KEY_01, KEY_02, COL_01, COL_02) 
VALUES('AAA','aaa','111','111'); -- 중복에러 에러(PRIMARY KEY) 

INSERT INTO TEST_01(KEY_01, KEY_02, COL_01, COL_02) 
VALUES('aaa','aaa','111','111'); 

-- 무결성까지 같이 삭제 
DROP TABLE TEST_01 
CASCADE CONSTRAINTS;  

-- 만들수 없다  
CREATE TABLE TEST_01( 
    KEY_01 VARCHAR2(10) CONSTRAINT PK_TEST_01 PRIMARY KEY, 
    KEY_02 VARCHAR2(10) CONSTRAINT PK_TEST_02 PRIMARY KEY, 
    COL_01 VARCHAR2(20), 
    COL_02 VARCHAR2(20) 
); 

-- 여러 PRIMARY KEY 만들기 
CREATE TABLE TEST_01( 
    KEY_01 VARCHAR2(10),  
    KEY_02 VARCHAR2(10),  
    COL_01 VARCHAR2(20), 
    COL_02 VARCHAR2(20), 
    CONSTRAINT PK_TEST_01 PRIMARY KEY(KEY_01, KEY_02) 
    USING INDEX TABLESPACE USERS 
); 
INSERT INTO TEST_01(KEY_01,KEY_02,COL_01,COL_02) 
VALUES('AAA','aaa' ,'',' '); 


DROP TABLE TEST_01 
CASCADE CONSTRAINTS;  

CREATE TABLE TEST_01( 
    KEY_01 VARCHAR2(10),  
    KEY_02 VARCHAR2(10),  
    COL_01 VARCHAR2(20), 
    COL_02 VARCHAR2(20) 
); 

-- PRIMARY KEY 추가 
ALTER TABLE TEST_01 
ADD 
CONSTRAINT PK_TEST_01 
PRIMARY KEY(KEY_01,KEY_02); 

-- PRIMARY KEY 삭제 
ALTER TABLE TEST_01 
DROP 
CONSTRAINT PK_TEST_01; 

-- PRIMARY KEY 확인 * 
SELECT 
    * 
FROM USER_CONSTRAINTS 
WHERE TABLE_NAME = 'TEST_01' 
        AND CONSTRAINT_TYPE = 'P'; 
         

-- UNIQUE KEY 고유키 
-- NULL 값을 제외한 유일하게 식별할 수 잇는키 
DROP TABLE TEST_01 
CASCADE CONSTRAINTS; 

CREATE TABLE TEST_01( 
    UKEY_01 VARCHAR2(10) CONSTRAINT UK_TEST_01 UNIQUE, 
    KEY_01 VARCHAR2(10), 
    COL_01 VARCHAR2(10) 
); 

INSERT INTO TEST_01(UKEY_01,KEY_01, COL_01) 
VALUES('AAA','aaa','111'); 

INSERT INTO TEST_01(UKEY_01,KEY_01, COL_01) 
VALUES('AAA','','111'); -- 에러 

INSERT INTO TEST_01(UKEY_01,KEY_01, COL_01) 
VALUES('','aaa','111'); 


------------------------------------------------------ 

-- CHECK 
-- 데이터의 값의 범위. 특정한 값의 지정이 가능 
-- NULL을 허용, 중복허용 

DROP TABLE TEST_01 
CASCADE CONSTRAINTS; 

CREATE TABLE TEST_01( 
    KEY_01 VARCHAR2(10), 
    KEY_02 VARCHAR2(10),  
    COL_01 VARCHAR2(20), 
    COL_02 NUMBER, 
    CONSTRAINT CHK_TEST_01 CHECK(COL_01 IN('남자', '여자', '기타')), 
    CONSTRAINT CHK_TEST_02 CHECK(COL_02 >= 1 AND COL_02 <= 99) 
); 

INSERT INTO TEST_01(KEY_01, KEY_02, COL_01, COL_02) 
VALUES('AAA', 'aaa', '남자', 52); 

INSERT INTO TEST_01(KEY_01, KEY_02, COL_01, COL_02) 
VALUES('AAA', 'aaa', '', ''); 

INSERT INTO TEST_01(KEY_01, KEY_02, COL_01, COL_02) 
VALUES('AAA', 'aaa', '', 100); 

INSERT INTO TEST_01(KEY_01, KEY_02, COL_01, COL_02) 
VALUES('AAA', 'aaa', '가나', 1); 

-- FOREIGN KEY 
-- 다른 테이블의 기본키 이거나 고유키를 참조하는 속성 또는 속성의 집합 

INSERT INTO EMPLOYEES(EMPLOYEE_ID,FIRST_NAME,LAST_NAME,EMAIL, PHONE_NUMBER, HIRE_DATE,JOB_ID, SALARY, COMMISSION_PCT, MANAGER_ID, DEPARTMENT_ID) 
VALUES(300,'길동','홍','HGD@EMAIL','020.123.4567',SYSDATE,'IT_PROG',1000,NULL,100,60); 

SELECT 
    * 
FROM EMPLOYEES; 

ROLLBACK; 

COMMIT; 

-- 부모 테이블 PRIMARY KEY 
CREATE TABLE TEST_PAR( 
    KEY_01 VARCHAR2(10), 
    KEY_02 VARCHAR2(10), 
    COL_01 VARCHAR2(20), 
    COL_02 VARCHAR2(20), 
    CONSTRAINT PK_TEST_PAR PRIMARY KEY(KEY_01, KEY_02) 
); 

-- 자식 테이블 FOREIGN KEY 
CREATE TABLE TEST_CHD( 
    KEY_01 VARCHAR(20) CONSTRAINT PK_TEST_CHD PRIMARY KEY, 
    KEY_02 VARCHAR(10), 
    FK_KEY_01 VARCHAR(10), 
    FK_KEY_02 VARCHAR(10), 
    CONSTRAINT FK_TEST_CHD FOREIGN KEY(FK_KEY_01,FK_KEY_02) 
    REFERENCES TEST_PAR(KEY_01,KEY_02) 
); 

INSERT INTO TEST_PAR(KEY_01,KET_02,COL_01,COL_02) 
VALUES('AAA','aaa','AAA','aaa');

'Oracle Database > SQL' 카테고리의 다른 글

[ORACLE] 데이터 베이스의 기본  (0) 2018.06.26
[ORACLE] DB의 무결성 제약 조건  (0) 2018.06.26
SQL 테이블 쿼리  (0) 2018.06.26
SQL 특수Query  (0) 2018.06.26
SQL SUB QUERY  (0) 2018.06.26