컬럼 속성(무결성 제약조건)

9mond·2023년 7월 25일
0
post-thumbnail
post-custom-banner
  • not null : null 값이 입력되지 못하게 하는 조건
  • unique : 중복된 값이 입력되지 못하게 하는 조건(ex. 사번, 주민번호..)
  • check : 주어진 값만 허용하는 조건(ex. 성별..)
  • primary key : not null + unique + index의 의미
  • foreign jey : 다른 테이블의 필드(컬럼)를 참조해서 무결성을 검사하는 조건

1. 기본키(Primary Key, PK)

  • 기본키 역시 기본적인 제약조건들은 테이블을 생성할 때 같이 정의한다.
  • 테이블당 하나만 정의 가능하다. (두 개 이상의 PK는 조합키/복합키라고 불린다. 묶어서 하나로 본다.)
  • 주키/ 기본키/ 식별자/ PK등으로 불리고 있다.
  • PK는 NOT NULL + UNIQUE + Index
  • 자동 Index가 생성되는데 이는 검색키로서 검색 속도를 향상시킨다.
 /* primary key */
CREATE TABLE primary_test(
	student_id	number(10) PRIMARY KEY,
	name		varchar2(20)
);
SELECT * FROM PRIMARY_TEST 

CREATE TABLE primary_test2(
	student_id	number(10),
	name		varchar2(20),
	CONSTRAINTS student_pk PRIMARY key(student_id)
);
SELECT * FROM PRIMARY_TEST2;

1-1. 기본키 선언 방법

  1)	
	create table pkTest(
		pkCol1	varchar2(10) primary key
		
	);
	

  2)	
	create table pkTest(
		pkCol1	varchar2(10) primary key constraints pk이름 primary key	
	);

  3)
	create table pkTest(
		pkCol1	varchar2(10),
		pkCol2	varchar2(10),
		pkCol3	varchar2(10),
		constraints pk이름 primary key(pkCol1)
	);

2. FOREIGN KEY

  • 외부키/ 외래키/ 참조키/ 외부 식별자/ FK 등으로 불린다.
  • FK가 정의된 테이블을 자식 테이블이라고 칭한다.
  • 참조되는 테이블 즉, PK가 있는 테이블을 부모 테이블이라고 한다.
  • 부모 테이블은 PK컬럼에 존재하는 데이터만 자식 테이블에 입력할 수 있다.
  • 부모 테이블은 자식의 데이터나 테이블이 삭제된다고 영향을 받지 않는다.
  • 참조하는 데이터 컬럼과 데이터 타입은 반드시 일치해야 한다.
  • 참조할 수 있는 컬럼은 기본키(PK)이거나 UNIQUE만 가능하다.
  • 보통은 PK랑 엮는다.
 /* foreign key */
CREATE TABLE daddy(
	idx		number(10),
	mID		number(10)	PRIMARY key
);

CREATE TABLE daughter(
	idx		number(10) PRIMARY KEY,
	mID 	number(10),
	CONSTRAINTS fk_daddy FOREIGN KEY (mID)
	REFERENCES daddy(mID) ON DELETE CASCADE
);
SELECT * FROM DADDY d ;
INSERT INTO daddy VALUES (1, 10);
INSERT INTO daddy VALUES (2, 20);
INSERT INTO daddy VALUES (3, 30);
DELETE FROM DADDY WHERE  idx = 2;

/*
IDX		MID
1		10
2		20
*/
SELECT  * FROM DAUGHTER d ;
INSERT  INTO DAUGHTER VALUES (100, 10);
INSERT  INTO DAUGHTER VALUES (101, 10);
INSERT  INTO DAUGHTER VALUES (102, 10);
INSERT  INTO DAUGHTER VALUES (200, 20);
INSERT  INTO DAUGHTER VALUES (201, 20);
INSERT  INTO DAUGHTER VALUES (202, 20);
INSERT  INTO DAUGHTER VALUES (300, 30);
INSERT  INTO DAUGHTER VALUES (301, 30);
INSERT  INTO DAUGHTER VALUES (302, 30);

2-1. 외래키 정의

  1)
	create table fk_test(
		department_id	varchar2(10)
		constraints fk이름 references departments(departments_id)  
	);

  2)
	create table fk_test(
		department_id	varchar2(10),
		...
		constraints dept_fk foreign key(department_id)
		references departments (department_id)  
	);

2-2. 삭제 옵션

  • ON DELETE CASCADE
    -> 참조되는 부모 테이블의 해에 대한 delete를 허용한다.
    즉, 참조되는 부모 테이블 값이 삭제되면 연쇄적으로 자식 테이블 값 역시 삭제된다.
    -> 보통 많이 사용

  • ON DELETE SET NULL
    -> 참조되는 부모 테이블의 해에 대한 delete를 허용한다.
    즉, 부모 테이블 값이 삭제가 되면 해당 참조하는 자식 테이블의 값들은 NULL값으로 설정된다.

    CREATE TABLE daddy2(
    	idx		number(10),
    	mID		number(10)	PRIMARY key
    );
    
    CREATE TABLE daughter2(
    	idx		number(10) PRIMARY KEY,
    	mID 	number(10),
    	CONSTRAINTS fk_daddy2 FOREIGN KEY (mID)
    	REFERENCES daddy2(mID) ON DELETE SET null
    );
    
    SELECT * FROM DADDY2 d ;
    INSERT INTO DADDY2 VALUES (1, 10);
    INSERT INTO DADDY2 VALUES (2, 20);
    INSERT INTO DADDY2 VALUES (3, 30);
    DELETE FROM DADDY2 WHERE  idx = 2;
    
    SELECT  * FROM DAUGHTER2 d ;
    INSERT  INTO DAUGHTER2 VALUES (100, 10);
    INSERT  INTO DAUGHTER2 VALUES (101, 10);
    INSERT  INTO DAUGHTER2 VALUES (102, 10);
    INSERT  INTO DAUGHTER2 VALUES (200, 20);
    INSERT  INTO DAUGHTER2 VALUES (201, 20);
    INSERT  INTO DAUGHTER2 VALUES (202, 20);
    INSERT  INTO DAUGHTER2 VALUES (300, 30);
    INSERT  INTO DAUGHTER2 VALUES (301, 30);
    INSERT  INTO DAUGHTER2 VALUES (302, 30);

3. Unique

  • unique 제약으로 들어가는 컬럼들은 그들의 조합이 유일해야 한다.
  • 각 컬럼의 데이터의 유일함은 의미가 없고, 조합이 유일해야 한다.
  • constraints 제약명 unique (컬럼1, 컬럼2, ..)
CREATE TABLE UNIQUE_TEST2  (
	col1	varchar2(20),
	col2	varchar2(20),
	CONSTRAINTS temp_unique2 unique(col1, col2)
);
SELECT * FROM UNIQUE_TEST2;

INSERT INTO UNIQUE_TEST2 (col1, col2)
VALUES ('aa','tt');
SELECT * FROM UNIQUE_TEST2;
profile
개발자
post-custom-banner

1개의 댓글

comment-user-thumbnail
2023년 7월 25일

많은 도움이 되었습니다, 감사합니다.

답글 달기