오라클[sql] 제약조건
제약조건
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 값;