Programming/오라클[SQL]

오라클[sql] 제약조건

콩king 2022. 8. 21. 13:13

제약조건

1. NOT NULL : 해당컬럼에 null 값을 허용하지 않는 제약조건

2. UNIQUE : 유일하게 식별하는 값만 허용 > 중복 허용 안한다 * null 허용(m null은 중복가능)

3. PRIMARY KEY : 기본키(*) + 모든 테이블에는 기보키가 하나 이상 있어야 합니다.

               UNIQUE + NOT NULL 합쳐진 경우

               null 값을 허용하지 않고 유일하게 식별가능 한 값

4. FOREIGN KEY : 다른테이블의 PK를 참조 * PK : 기본키

5. CHECK : 입력을 제한하여 받을 수 있습니다. 등록한 단어들만 입력가능

6. (*) DEFAULT : 제약조건 아닙니다 > 입력값이 없을 때 채워지는 값으로 제약조건처럼 사용

 

사용방법

제약조건은 보통 테이블을 만들 때 같이 생성

 

▶ 컬럼레벨 제약조건 방식
  CREATE TABLE 테이블명 (
      컬럼명 데이터타입 "제약조건"
  )
 

▶ 테이블레벨 제약조건 방식
  CREATE TABLE 테이블명 (
      컬럼명 데이터타입;
      CONSTRAINT 제약조건이름 "제약조건" 컬럼명
  )
 

▶ 테이블레벨 추천

  -  모든 제약조건은 데이터베이스 저장하는데,  의미있는 이름을 부여해야 제약조건들을 사용하기 쉽습니다.

  - NOT NULL 은 컬럼레벨으로만 적용가능

 

 

NOT NULL

CREATE TABLE INFO2(

    NAME VARCHAR2(10) NOT NULL, -- 컬럼레벨에서만 사용가능

    TEL VARCHAR2(10)
);

 

INSERT INTO INFO2 (NAME)

VALUES ('A');

INSERT INTO INFO2 (NAME)

VALUES ('');    -- 에러 : NAME 은 NOT NULL 제약조건이있기 때문에

INSERT INTO INFO2 (TEl)

VALUES ('B');    -- 에러 : NAME 은 NOT NULL 제약조건이있기 때문에

 

SELECT * FROM info2;

 

 

UNIQUE

UNIQUE : 유일

 

▶ 컬럼레벨

CREATE TABLE INFO3(

    NAME VARCHAR2(10) UNIQUE,

    TEL VARCHAR2(10)
);

 

▶ 테이블레벨 : CONSTRAINT + 제약조건이름설정가능 특징

CREATE TABLE INFO3(

    NAME VARCHAR2(10),

    TEL VARCHAR2(10),

    CONSTRAINT info2_name_uq UNIQUE(name)

);

 

INSERT INTO INFO3 (NAME)

VALUES ('A');

INSERT INTO INFO3 (NAME)

VALUES ('A');    -- 유니크컬럼에 중복된 값을 입력하려면 에러가 발생 : ORA-00001

INSERT INTO INFO3 (TEL)

VALUES ('B');

 

SELECT * FROM info3;

 

 

PRIMARY KEY

▶ PRIMARY KEY ( 기본키, PK, 주키 , 프라이머리키, 식별키 )

    - 기본키 ( UNIQUE + NOT NULL  제약조건이 적용된 상태 )

    - 중복안됨, null 안됨, 무조건 값이 하나 있고, 유일한 값이어야 합니다.

    - 기본키는 테이블에서 한개 이상 컬럼에서 가져야하는 제약조건이며, 테이블의 대표(식별) 이기 떄문에 상단에 작성

           * 만약 기본키 제약조건을 가진 컬럼이 2개라면? > 2개의 컬럼의 내용이 유일하기만 하면 됩니다.

           김 010 / 김 011 / 김 017 / 신 010 / 신 011 / 김 010(중복)

           기본키제약조건 컬럼내용을 합쳐서 봤을 때 유일하기만 하면 됩니다.

    - UNIQUE + NOT NULL != PK 다른 제약 조건입니다.

 

▶ 컬럼레벨

CREATE TABLE INFO2(

    NAME VARCHAR2(10) PRIMARY KEY,

    TEL VARCHAR2(10)

);

 

▶ 테이블레벨 : CONSTRAINT + 제약조건이름설정가능 특징

CREATE TABLE INFO3(

    NAME VARCHAR2(10),

    TEL VARCHAR2(10),

    CONSTRAINT info3_name_pk PRIMARY KEY (name)

);

 

INSERT INTO INFO3(NAME)

VALUES ('A');

INSERT INTO INFO3(NAME)

VALUES ('A');    -- 유니크컬럼에 중복된값을 입력하려면 에러가 발생 : ORA-00001

INSERT INTO INFO3(TEL)

VALUES ('B');    -- name 컬럼에 not  null 안됨.

 

SELECT * FROM INFO3;

 

 

FOREIGN KEY

    - 다른테이블에 있는 값을 이용하여 제약조건을 설정 (다른테이블의 기본키라는 제약조건을 가진 컬럼을 참조)

    - 내컬럼의 값들이 테이블의 기본키의 값들을 참조하는 상황

 

CONSTRAINT 제약조건명 FOREIGN KEY 내컬럼명

REFERENCES 참조테이블(테이블의기본키)

 

CREATE TABLE INFO4(

    NAME VARCHAR2(10),

    JUMIN VARCHAR2(20),

    CONSTRAINT fk_info3_info4_name FOREIGN KEY(name)

    REFERENCES info3(name)  -- 참조대상 설정

);

 

INSERT INTO INFO4(NAME)

VALUES ('A');

INSERT INTO INFO4(NAME)

VALUES ('B');     -- info3에 name에 B가 먼저 들어가 있어야지 info4에 B를 넣을 수 있음

INSERT INTO INFO3(NAME)

VALUES ('B');

 

SELECT * FROM INFO3;

SELECT * FROM INFO4;

 

 

CHECK

    - 설정한 값만 입력

 

CREATE TABLE INFO5(

  GENDER VARCHAR2(10) NOT NULL,

  CONSTRAINT chk_gender CHECK( gender IN ('남성', '여성') )
);

 

INSERT INTO INFO5(GENDER)

VALUES ('남성');

INSERT INTO INFO5(GENDER)

VALUES ('남');     -- 체크 제약조건(MIRI.CHK_GENDER)이 위배되었습니다

 

SELECT * FROM INFO5;

 

 

DEFAULT

    - 초기값 설정

 

CREATE TABLE INFO6(

    GENDER VARCHAR2(10) DEFAULT '남성' NOT NULL,

    TEL VARCHAR2(10)

);

 

INSERT INTO INFO6(TEL)

VALUES ('123');

 

SELECT * FROM INFO6;

 

 

테이블 생성후 제약조건 추가하려면 ???  테이블 수정

ALTER TABLE 테이블명

ADD CONSTRAINT 제약조건이름 "제약조건" (대상컬럼) REFERENCES 대상데이블명(컬럼명)

 

ALTER TABLE 테이블명

MODIFY 컬럼명 DEFAULT 값;