무결성 : 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 |