-- 무결성 : 컬럼에 지정하는 성질
-- 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;