본문 바로가기

Oracle/Oracle 기초

기본키, Unique , Check, Foregin Key, Not Null, Update, DELETE

반응형
-- 무결성 : 컬럼에 지정하는 성질
-- Primary Key(PK) : 기본키, NULL 허용X, 중복된 키값 허용X(중복되지 않는 키값을 넣어야한다)  ID에 해당
-- Unique Key(UK) : 고유키. NULL을 허용, 중복되지 않는 값. email
-- Check : 범위를 설정. NULL을 허용함.
-- Foreign Key(FK) : 외래키. 다른 table에서 primary key, unique key여야 한다.
--                   테이블과 테이블을 연결하는 목적을 갖고 있다. (Join)
--                   외래키값은 NULL을 허용한다.
-- NOT NULL : NULL을 허용하지 않음.

-- NOT NULL
CREATE TABLE TB_TEST(
    COL_01 VARCHAR2(10) NOT NULL,
    COL_02 VARCHAR2(20)
);

INSERT INTO TB_TEST(COL_01, COL_02)
VALUES('AAA', 'aaa');

INSERT INTO TB_TEST(COL_01, COL_02)
VALUES('AAA', '');

SELECT * from tb_test;

INSERT INTO TB_TEST(COL_01, COL_02) -- 무결성 
VALUES('', 'aaa');                                         

-- Primary Key = NOT NULL + Unique
-- 유일하게 식별할 수 있는 정의된 규칙
-- 한 테이블에서 최대 32개 컬럼까지 지정할 수 있음.
-- CONSTRAINT == 무결성
CREATE TABLE TEST_01(
    KEY_01 VARCHAR2(10) CONSTRAINT PK_TEST_01 PRIMARY KEY, -- PRIMARY KEY에 대한 ID
--    KEY_01 VARCHAR2(10) PRIMARY KEY -- 이래도 가능하지만 PK를 지울 방법이 없다.
    KEY_02 VARCHAR2(10),
    COL_01 VARCHAR2(20)
);

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

INSERT INTO test_01(KEY_01, KEY_02, COL_01)
VALUES('BBB', 'bbb', '222');

--NULL 허용 안하기때문에 오류 발생 
INSERT INTO test_01(KEY_01, KEY_02, COL_01)
VALUES('', 'aaa', '222');

DROP TABLE TEST_01
CASCADE CONSTRAINTS; --이걸 안해주면 key값이 지워지지 않는다

SELECT
    *
FROM TEST_01;

-- 안됨
CREATE TABLE TEST_01(
    KEY_01 VARCHAR2(10) CONSTRAINT PK_TEST_01 PRIMARY KEY, -- PRIMARY KEY에 대한 ID
    KEY_02 VARCHAR2(10) CONSTRAINT PK_TEST_02 PRIMARY KEY ,
    COL_01 VARCHAR2(20)
);


-- 됨
CREATE TABLE TEST_01(
    KEY_01 VARCHAR2(10),
    KEY_02 VARCHAR2(10),
    COL_01 VARCHAR2(20),
    CONSTRAINT PK_TEST_01 PRIMARY KEY(KEY_01, KEY_02)
);     

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


INSERT INTO TEST_01(KEY_01, KEY_02, COL_01)
VALUES ('AAA', 'AAA', '111');  -- 세트로 취급해서 오류가 발생하지 않는다. 

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


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

-- 기본키 추가 
alter table TEST_01
add CONSTRAINT PK_TEST_01
PRIMARY KEY(KEY_01, KEY_02);

-- 기본키 삭제
alter table test_01
drop CONSTRAINT PK_TEST_01;

-- Unique Key : 고유키 : Email

DROP TABLE TEST_01
CASCADE CONSTRAINTS;

CREATE TABLE TEST_01 (
    UKEY_01 VARCHAR2(10) CONSTRAINT UK_TEST_01 UNIQUE, -- Primary처럼 반복일떈 밑으로 빼야한다
    COL_01 VARCHAR2(10),
    COL_02 VARCHAR2(20), 
);

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

SELECT * FROM test_01;

-- 유니크 키 삭제
ALTER TABLE TEST_01
DROP CONSTRAINT UK_TEST_01;

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

DROP TABLE TEST_01
CASCADE CONSTRAINTS;

CREATE TABLE TEST_01(
    KEY_01 VARCHAR2(10), 
    COL_01 VARCHAR2(10),
    CONSTRAINT CHK_TEST_01 CHECK(KEY_01 IN('사과', '배', '바나나')),
    CONSTRAINT CHK_TEST_02 CHECK(COL_01 > 0 and COL_01 <= 100)
);

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

--오류 발생 
INSERT INTO TEST_01(KEY_01, COL_01)
VALUES ('귤', 10);

-- NULL 허용 
INSERT INTO TEST_01(KEY_01, COL_01)
VALUES ('', '');

select * from TEST_01;

-- FOREIGN KEY
-- 테이블과 테이블을 연결하기 위한 무결성 제약 조건
-- 다른 테이블(자식)의 값이 기본키, 고유키로 사용해야 한다.
-- NULL을 허용

-- 기본키가 있는 TABLE -> DEPARTMENTS
CREATE TABLE TEST_PAR(
    PKEY_01 VARCHAR2(10),
    PKEY_02 VARCHAR2(10), 
    COL_01 VARCHAR2(20),
    COL_02 VARCHAR2(20),
    CONSTRAINT PK_TEST_01 PRIMARY KEY(PKEY_01, PKEY_02)
);

-- 외래키가 있는 TABLE -> EMPLOYEES
CREATE TABLE TEST_CHG(
    COL_1 VARCHAR2(10),
    FKEY_01 VARCHAR2(10), --부모와 크기를 맞춰줘야한다
    FKEY_02 VARCHAR2(10),
    CONSTRAINT FK_TEST_01 FOREIGN KEY(FKEY_01, FKEY_02)
        REFERENCES TEST_PAR(PKEY_01, PKEY_02)
);

INSERT INTO TEST_PAR(PKEY_01, PKEY_02, COL_01, COL_02)
VALUES('AAA', 'aaa', '111', '!!!');

INSERT INTO TEST_PAR(PKEY_01, PKEY_02, COL_01, COL_02)
VALUES('BBB', 'bbb', '222', '@@@');

--부모테이블에 있는 값을 토대로 넣어야한다
INSERT INTO TEST_CHG(COL_1, FKEY_01, FKEY_02)
VALUES ('ABC', 'AAA', 'aaa');

--저쪽에 있는 키값을 넣으면서 우리데이터를 넣어야된다 
INSERT INTO TEST_CHG(COL_1, FKEY_01, FKEY_02)
VALUES ('ABC', 'aaa', 'aaa');


INSERT INTO TEST_CHG(COL_1, FKEY_01, FKEY_02)
VALUES ('BCD', 'BBB', 'bbb');

INSERT INTO TEST_CHG(COL_1, FKEY_01, FKEY_02)
VALUES ('CDE', '', '');

-- UPDATE
-- 복제할때는 CHECK 조건만 넘어오고 나머지 PRIMARY나 외래키가 다 사라져있다.

CREATE TABLE EMP
AS
SELECT
    *
FROM employees;

-- insert into 
-- update set where
UPDATE EMP
SET salary = 12000
where employee_id = 100;

UPDATE EMP
SET salary = 12000, department_id = null
where employee_id = 100;

COMMIT; -- 적용
ROLLBACK; -- 되돌리기 (커밋을 한 후엔 롤백이 되지 않는다)
                                                            
-- DELETE
DELETE
FROM EMP
WHERE salary > 15000;

                            
반응형

'Oracle > Oracle 기초' 카테고리의 다른 글

Oracle - View  (0) 2019.12.19
Oracle 테이블 생성및 관리하기  (0) 2019.12.18
오라클 문제 풀이 (Sub 쿼리 활용)  (0) 2019.12.17
Oracle 특수 쿼리 및 집합  (0) 2019.12.17
Oracle Sub Query(2중 쿼리)  (0) 2019.12.16