본문 바로가기

Database/Oracle

무결성 table 생성과 key, 외래키

    무결성 : column에 적용
            COLUMN을 지정하는 성질. 설정
            
    Primary Key(PK) : 기본키. NULL을 허용하지 않는다. 중복을 허용하지 않는다. (EX, ID, 주민번호)
    Unique Key(UK) : 고유키. NULL을 허용한다. 중복을 허용하지 않는다. (EX, E-MAIL)
    Foreign Key : 외래키. 테이블과 테이블을 연결하는 목적의 성질이다. (JOIN의 목적이다), NULL허용
                    외래키로 설정된 컬럼은 연결된 테이블에서 PK나 UK로 설정되어 있어야 한다
    CHECK : 범위를 설정. NULL을 허용
    NOT NULL : NULL을 허용하지 않는다

 

 

 

 

 

---FOREIGN KEY : 외래키 , 테이블끼리의 연결
--TABLE과 TABLE을 연결하기 위한 무결성 제약조건이다.
--다른 테이블(부모테이블)에서는 컬럼이 PK, UK로 설정되어 있어야 한다.
--NULL 을 허용한다

--삭제
DROP TABLE TB_PARENT
CASCADE CONSTRAINTS;

DROP TABLE TB_CHILD
CASCADE CONSTRAINTS;

--테이블끼리 연결 
--DEPARTMENT의
CREATE TABLE TB_PARENT(
    PKCOL01 VARCHAR2(10),   --DEPARTMENT_ID
    COL_01 VARCHAR2(20),
    COL_02 VARCHAR2(30),
    CONSTRAINT PK_TB_PARENT PRIMARY KEY(PKCOL01)
);

--ENPLOYEES의
CREATE TABLE TB_CHILD(
    KEY_01 VARCHAR2(10),
    KEY_02 VARCHAR2(10),
    FKCOL01 VARCHAR2(10),       --DEPARTMENT_ID
    CONSTRAINT FK_TB_CHILD FOREIGN KEY(FKCOL01)
    REFERENCES TB_PARENT(PKCOL01)                   --FKCOL01과 PKCOL01이 동일한 키(외래키)라고 연결시켜줌
);


--데이터 넣기
--PARENT
INSERT INTO tb_parent(PKCOL01, COL_01, COL_02)
VALUES('AAA','aaa','가가가');

INSERT INTO tb_parent(PKCOL01, COL_01, COL_02)
VALUES('BBB','bbb','나나나');

INSERT INTO tb_parent(PKCOL01, COL_01, COL_02)
VALUES('CCC','ccc','다다다');


--CHILD
INSERT INTO tb_child(KEY_01, KEY_02, FKCOL01)   -- 외래키의 값을 넣을 땐 PARENT테이블의 PK키 값 혹은 NULL을 넣어 값끼리 연결
VALUES('123','가나다','BBB');

INSERT INTO tb_child(KEY_01, KEY_02, FKCOL01)   -- NULL 가능
VALUES('234','나다라','');

SELECT * FROM tb_child;

--현결된 값 출력
SELECT c.key_01, c.key_02,
    c.fkcol01, p.pkcol01,
    p.col_01, p.col_02
FROM tb_child c,  tb_parent p
WHERE c.fkcol01 = p.pkcol01;

 

 

 

 

---Primary Key = Unique + NOT NULL
--식별자로 많이사용, 한 테이블에서 최대 32개 컬럼까지 지정할 수 있다.
--CONSTRAINT : 무결성

--무결성 전체 삭제
DROP TABLE TEST_01
CASCADE CONSTRAINTS;        -- 무결성까지 전체 삭제. DROP만 하면 PK는 남을 수 있음

CREATE TABLE TEST_01(
    PKCOL VARCHAR2(10) CONSTRAINT PK_TEST_01 PRIMARY KEY,    --NULLABLE : NO
    COL1 VARCHAR2(20),
    COL2 VARCHAR2(30)
);

INSERT INTO test_01(PKCOL, COL1, COL2)
VALUES('AAA', 'aaa', '111');            --두번 생성하면 unique constraint 라고 에러가 남

INSERT INTO test_01(PKCOL, COL1, COL2)  --PKCOL만 값을 바꿔주면 잘 들어감
VALUES('BBB', 'aaa', '111');   

SELECT
    *
FROM test_01;

INSERT INTO test_01(PKCOL)              --COL1, COL2는 NULL을 허용
VALUES('CCC');   

INSERT INTO test_01(PKCOL, COL1, COL2)  --에러, PKCOL은 NULL허용 안함(Primary Key)
VALUES('', 'aaa', '111');   


CREATE TABLE TEST_01(
    PKCOL VARCHAR2(10) CONSTRAINT PK_TEST_01 PRIMARY KEY,    
    COL1 VARCHAR2(20) CONSTRAINT PK_TEST_02 PRIMARY KEY,    --에러 : PK는 한테이블에 1개
    COL2 VARCHAR2(30)
);

--PK 다수 설정하는 방법
CREATE TABLE TEST_01(
    PKCOL VARCHAR2(10), 
    COL1 VARCHAR2(20),  
    COL2 VARCHAR2(30),
    CONSTRAINT PK_TEST_01 PRIMARY KEY(PKCOL, COL1)  --32개까지 가능
);

CREATE TABLE TEST_01(
    PKCOL VARCHAR2(10), 
    COL1 VARCHAR2(20),  
    COL2 VARCHAR2(30)
);

INSERT INTO test_01(PKCOL, COL1, COL2)
VALUES('AAA', 'aaa', '111');

ALTER TABLE TEST_01             --수정을 이용하여 PK를 넣어줌
ADD
CONSTRAINT PK_TEST_01
PRIMARY KEY(PKCOL, COL1);

SELECT
    *
FROM test_01;

--PK Key 삭제하기 (DROP CONSTRAINT)
ALTER TABLE TEST_01
DROP CONSTRAINT PK_TEST_01; 

 

 

 

 

---UNIQUE : 고유키. 중복된 값을 허용하지 않고 NULL가능

 고유키. 중복된 값을 허용하지 않고 NULL가능
CREATE TABLE TEST_02(
    UKCOL VARCHAR2(10) CONSTRAINT UK_TEST_02 UNIQUE,
    COL_01 VARCHAR2(20),
    COL_02 VARCHAR2(20)
);

INSERT INTO TEST_02(UKCOL, COL_01, COL_02)
VALUES('AAA', 'aaa', '111');

INSERT INTO TEST_02(UKCOL, COL_01, COL_02)
VALUES('', 'aaa', '111');                       --빈칸 허용

INSERT INTO TEST_02(COL_01, COL_02)
VALUES('aaa', '111');  

--UNIQUE 설정 삭제
ALTER TABLE TEST_02
DROP CONSTRAINT UK_TEST_02;                 

 

 

 

 

---CHECK :지정된 값(범위)만 입력할 수 있고 NULL을 허용

지정된 값(범위)만 입력할 수 있고 NULL을 허용
CREATE TABLE TB_CHECK(
    COL_01 VARCHAR2(10),
    KEY_01 VARCHAR2(10),
    CONSTRAINT CHK_TB_CHECK01 CHECK( COL_01 IN('사과', '배', '바나나')),  --3개 값중 하나
    CONSTRAINT CHK_TB_CHECK02 CHECK( KEY_01 > 0 AND KEY_01 <= 100)         --범위 값중 하나 
);

INSERT INTO TB_CHECK(COL_01, KEY_01)
VALUES('사과',50);

INSERT INTO TB_CHECK(COL_01, KEY_01)    --숫자 설정범위에 0은 포함 안해놔서 에러가 남
VALUES('사과',0);

INSERT INTO TB_CHECK(COL_01, KEY_01)
VALUES('사과',10);

INSERT INTO TB_CHECK(COL_01, KEY_01)
VALUES('',25);

INSERT INTO TB_CHECK(COL_01, KEY_01)
VALUES('','');

SELECT
    *
FROM tb_check;

 

 

 

 

 

 

NOT NULL : NULL을 허용하지 않는다

-- NOT NULL
CREATE TABLE TB_TEST(
    COL_01 VARCHAR2(10) NOT NULL,       --COL_01 VARCHAR2(바이트크기)
    COL_02 VARCHAR2(20)
);

INSERT INTO tb_test(COL_01, COL_02)
VALUES('AAA','111');

SELECT
    *
FROM tb_test;

INSERT INTO tb_test(COL_01, COL_02)
VALUES('','222');       --오류(NULL허용 안함)-> COL_01은 NOT NULL로 지정했기 때문

INSERT INTO tb_test(COL_01)
VALUES('CCC');          --COL02는 자동으로 NULL 설정됨

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

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

INDEX  (0) 2020.06.25
Sequence(SEQ), 동의어  (0) 2020.06.25
table 생성 및 셋팅  (0) 2020.06.24
헷깔리는 함수문제~  (0) 2020.06.23
순위함수  (0) 2020.06.23