티스토리 뷰

데이터 무결성

데이터가 손상되거나 원래의 의미를 잃지 않고 유지되는 상태

 

*무결성 제약조건 : 입력되는 자료들의 규칙을 정해 줌

제약조건 설명 설정 레벨
NOT NULL 해당 컬럼에 NULL을 입력할 수 없도록 컬럼
UNIQUE 해당 컬럼 또는 컬럼 조합 값이 유일하도록 컬럼, 테이블
PRIMARY KEY 각 행을 유일하게 식별할 수 있도록 컬럼, 테이블
FOREIGN KEY 다른 테이블의 기본키를 참조 컬럼, 테이블
CHECK 해당 컬럼에 특정 조건을 항상 만족시키도록 컬럼, 테이블

 

 

제약조건

이름으로 관리

  • 문자로 시작, 길이는 30까지 가능
  • 이름을 따로 지정하지 않으면 Oracle이 정한 이름으로 자동 생성(Oracle 환경에 따라 각각 다를 수 있음)

 

생성 시기

  • 테이블 생성과 동시
  • 테이블을 생성한 후

 

<NOT NULL>

ex) 1. 컬럼에 직접 입력

CREATE TABLE TABLE_NOTNULL01(
  ID CHAR(3) NOT NULL,
  NAME VARCHAR2(20)
);
INSERT INTO TABLE_NOTNULL01 VALUES(‘100’,’ORACLE’);

 

ex) 2. CONSTRAINT 에서 NOT NULL 제약조건을 설정하려 하면 ERROR 발생!!!

CREATE TABLE TABLE_NOTNULL02(
  ID CHAR(3),
  NAME VARCHAR2(20),
  CONSTRAINT TN02_ID_NN NOT NULL(ID)
);

 

<UNIQUE>

 

ex) 1. 컬럼에 직접 입력

CREATE TABLE TABLE_UNIQUE01(
  ID CHAR(3) UNIQUE,
  NAME VARCHAR2(20)
);
INSERT INTO TABLE_UNIQUE01 VALUES(‘100’,’ORACLE’);
INSERT INTO TABLE_UNIQUE01 VALUES(‘100’,’JAVA’);

** 2번째 INSERT 에서 에러 : ID 는 UNIQUE KEY 이기 때문에 중복된 값을 넣을 수 없다

(ERROR 코드는 제약조건 이름을 명시하지 않았기 때문에 ORACLE이 정한 이름이 나온다.

-> 이건 각 ORACLE 상황에 따라 다를 수 있음

 

 

INSERT INTO TABLE_UNIQUE01 VALUES(NULL,’JAVA’); --NULL 가능!!

NULL 허용 = 아무것도 없거나, 다른 애들이랑 다르거나 둘중 하나를 허용한다!!

 

 

ex) 2. CONSTRAINT 로 제약조건 명시

CREATE TABLE TABLE_UNIQUE02(
  ID CHAR(3),
  NAME VARCHAR2(20),
  NUM NUMBER,
  CONSTRAINT TU02_ID_UN UNIQUE(ID,NAME)	--SUPER KEY = 복합키
);

**슈퍼키(Super Key) : 복합키(Composite key) 또는 연결키 -> 2개 이상의 컬럼을 묶어 식별 가능하다면 key 로 쓴다.

 

이 경우   CONSTRAINT TU02_ID_UN UNIQUE(ID,NAME) -> ID, NAME 두개의 컬럼을 묶어 UNIQUE KEY 를 만들었다.

 

ID와 NAME 의 조합이 겹치는 TUPLE/ROW 가 나올 경우 ERROR 발생. (ERROR 이름은 우리가 정해준 'TU02_ID_UN')

 

CREATE TABLE TABLE_UNIQUE02(
  ID CHAR(3),
  NAME VARCHAR2(20),
  NUM NUMBER,
  CONSTRAINT TU02_ID_UN UNIQUE(ID),
  CONSTRAINT TU02_NAME_UN UNIQUE(NAME)
);

**SUPER KEY 가 아니라 각각 UNIQUE 제약조건을 걸고 싶다면 이렇게 따로따로 두 줄을 써주면 된다.

 

INSERT INTO TABLE_UNIQUE02 VALUES(‘100’,’ORACLE’,1);
INSERT INTO TABLE_UNIQUE02 VALUES(‘100’,’JAVA’,2);
INSERT INTO TABLE_UNIQUE02 VALUES(‘100’,’JAVA’,3);

ERROR -> 3열의 INSERT문에서 100, JAVA 라는 컬럼값이 겹쳐서 UNIQUE 제약조건에 위배되므로 ERROR 발생!

(ERROR 코드는 우리가 정한 CONSTRAINT 이름인 'TU02_ID_UN' 

 

 

 

<PRIMARY KEY = UNIQUE + NOT NULL>

 

ex) 1. 해당 컬럼에 직접 입력

CREATE TABLE TABLE_PK01(
  ID CHAR(3) PRIMARY KEY,
  NAME VARCHAR2(20)
);
INSERT INTO TABLE_PK01 VALUES(‘100’, ‘ORACLE‘);
INSERT INTO TALBE_PK01 VALUES(‘200’, ‘ORACLE’);
INSERT INTO TALBE_PK01 VALUES(NULL, ‘ORACLE’);

** 3 번째 INSERT 문에서 오류!! (PRIMARY KEY 로 지정된 컬럼에서는 NULL 을 넣을 수 없다!!)

 

 

ex) 2. CONSTRAINT 제약조건에 명시

CREATE TABLE TABLE_PK02(
  ID CHAR(3),
  NAME VARCHAR2(20),
  NUM NUMBER,
  CONSTRAINT TP02_PK PRIMARY KEY (ID,NAME)
);

ID와 NAME 을 조합해 PRIMARY KEY 를 만들었다. ( = 복합키 = SUPER KEY )

ID와 NAME 의 조합이 겹치는 TUPLE 이 있을 경우 ERROR

-> 둘 중 하나만 겹치는 경우에는 상관 없음!!

-> 둘 중 하나만 NULL 이어도 ERROR

 

 

 

<FOREIGN KEY>

다른 테이블의 기본키를 참조한다.

 

ex) 1. 컬럼에 직접 명시

CREATE TABLE TABLE_FK01(
  ID CHAR(3) PRIMARY KEY,
  NAME VARCHAR2(20),
  PKID CHAR(3) REFERENCES TABLE_PK01(ID)
);
INSERT INTO TABLE_FK01 VALUES(‘123’,’ORACLE’,’100’);
INSERT INTO TABLE_FK01 VALUES(‘124’,’JAVA’,’200’);
INSERT INTO TABLE_FK01 VALUES(‘125’,’ORACLE’,’300’);

PARENT TABLE에 300 이라는 ID 가 없으면 오류!!!

 

 

ex) 2. CONSTRAINT 제약조건에 명시

CREATE TABLE TABLE_FK02(
  ID CHAR(3) PRIMARY KEY,
  NAME VARCHAR2(20),
  PKID CHAR(3), 
  FOREIGN KEY(PKID) REFERENCES TABLE_PK01(ID)
);
INSERT INTO TABLE_FK02 VALUES(‘123’,’ORACLE’,’100’);
INSERT INTO TABLE_FK02 VALUES(‘124’,’JAVA’,’200’);
INSERT INTO TABLE_FK02 VALUES(‘125’,’ORACLE’,’300’);

PARENT TABLE에 300 이라는 ID 가 없으면 오류!!!

 

 

 

<CHECK>

해당 컬럼에 특정 조건을 항상 만족시키도록

 

 

ex) 1. 컬럼명에 직접 명시

CREATE TABLE TABLE_CHECK01(
  EMP_ID CHAR(3) PRIMARY KEY,
  NAME VARCHAR2(20),
  MARRIAGE CHAR(1) CHECK(MARRIAGE IN(‘Y’,’N’))
);
INSERT INTO TABLE_CHECK01 VALUES(‘123’,’HONG’,’Y’);
INSERT INTO TABLE_CHECK01 VALUES(‘124’,’LEE’,’N’);
INSERT INTO TABLE_CHECK01 VALUES(‘125’,’KIM’,’A’);

3번째 컬럼인 MARRIAGE는 CHECK 제약조건에 따라 Y 혹은 N 이 나와야 한다. 

-> A 입력은 ERROR

 

ex) 2. CONSTRAINT 제약조건에 명시

CREATE TABLE TABLE_CHECK02(
  EMP_ID CHAR(3) PRIMARY KEY,
  NAME VARCHAR2(20),
  MARRIAGE CHAR(1),
  CONSTRAINT TC_CK CHECK(MARRIAGE IN(‘Y’,’N’))
);
INSERT INTO TABLE_CHECK02 VALUES(‘123’,’HONG’,’Y’);
INSERT INTO TABLE_CHECK02 VALUES(‘124’,’LEE’,’N’);
INSERT INTO TABLE_CHECK02 VALUES(‘125’,’KIM’,’A’);

3번째 컬럼인 MARRIAGE는 CHECK 제약조건에 따라 Y 혹은 N 이 나와야 한다.

-> A 입력은 ERROR

 

 

 

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/07   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 31
글 보관함