제약조건이란, SQL 테이블에 문제되는/ 결함있는 데이터가 입력되지 않도록 컬럼별로 미리 지정해 둔 조건입니다. DESC 명령어를 통해서 변수별로 NULL이 가능한지 조회가 가능하고, GUI를 이용해 테이블의 제약 조건을 모아서 볼 수도 있습니다.
이렇게 칼럼에 설정된 조건을 제약조건(CONSTRAINTS)이라고 한다.
제약조건은 테이블을 생성할 때 함께 설정할 수 있고, 추후에 ALTER 등의 명령어를 사용하여 바꿀 수 있음.
기본키라고도 부른다. PRIMARY KEY를 제약조건으로 가진 컬럼은 같은 데이터 중복불가와 NULL값을 허용하지 않는다. 즉 UNIQUE+NOT NULL이 합쳐진 제약조건인 셈이다. 테이블당 1개만 생성할 수 있고, 여러 컬럼을 묶어서 하나의 기본키로 만드는 것도 가능하다.
생성)
ALTER TABLE 테이블명 ADD CONSTRAINT 제약조건이름 제약조건 (컬럼명)
예시) ALTER TABLE STORETABLES
ADD CONSTRAINT TA_STCODE_CODE_PK PRIMARY KEY(TA_STCODE, TA_CODE);
삭제)
ALTER TABLE 테이블명 DROP CONSTRAINT 제약조건이름;
예시) ALTER TABLE STORETABLES DROP CONSTRAINT TA_STCODE_CODE_PK;
외래키라고 부르는 제약조건이다. 참조키,외부키,외래키 여러갖지 이름으로 부를 수 있는데 다른 테이블의 컬럼을 참조하는 기능을 하고 있다. 외래키가 정의된 테이블을 자식 테이블이라고 부른다. 참조하는 테이블의 컬럼과 외래키를 가지고 있는 컬럼의 데이터타입이 반드시 일치해야한다. 중복값을 허용하지 않는 유일한 데이터를 가진 컬럼 즉 PRIMARY KEY나 UNIQUE를 가진 컬럼에만 참조가 가능하다.
생성)
ALTER TABLE 테이블명 ADD CONSTRAINT 제약조건이름 제약조건 (컬럼명) REFERENSE 부모테이블(부모키)
예시) ALTER TABLE STORECATEGORIES ADD CONSTRAINT SC_SGCODE_FK FOREIGN KEY(SC_SGCODE) REFERENCES STORES(ST_CODE);
삭제)
ALTER TABLE 테이블명 DROP CONSTRAINT 제약조건이름;
예시) ALTER TABLE STORECATEGORIES DROP CONSTRAINT SC_SGCODE_FK;
외래키로 참조하고 있을 경우 참조를 당하는 부모 테이블의 컬럼의 값은 삭제할 수가 없다. 삭제하고 싶다면 외래키를 전부 삭제 한다음에 는 삭제를 할 수가 있는데 굉장히 번거롭다. 외래키를 가진 테이블에 따로 속성을 주면 부모 테이블과 자식테이블의 값도 삭제할 수 있다.
ON DELETE CASCADE
부모 테이블를 삭제할 수 있으며 자식 테이블의 데이터도 삭제된다.
ON DELETE SET NULL
부모 테이블을 삭제할 수 있으며 자식 테이블의 값이 NULL이 된다.
중복값을 허용하지 않는 제약조건이다. NOT NULL과도 함께 쓸 수 있다.
생성)
1)
CREATE TABLE TEST(
id NUMBER(5),
name VARCHAR(20) UNIQUE NOT NULL,
title VARCHAR(30)
2)
CREATE TABLE TEST(
id NUMBER(5),
name VARCHAR(20),
title VARCHAR(30),
CONSTRAINT name_unique UNIQUE (name);
3)
ALTER TABLE 테이블명 DROP CONSTRAINT uk_테이블명_컬럼명
삭제)
ALTER TABLE 테이블명 DROP CONSTRAINT uk_테이블명_컬럼명
NOT NULL을 가진 컬럼은 반드시 데이터가 들어와야한다. 즉 NULL값을 허용하지 않는다.
생성)
1)
CREATE TABLE TEST(
id NUMBER(5),
name VARCHAR(20),
title VARCHAR(30) NOT NULL
2)
ALTER TABLE (테이블명) ALTER COLUMN (컬럼명) (테이터 타입) NOT NULL;
삭제)
ALTER TABLE (테이블명) ALTER COLUMN (컬럼명) (테이터 타입);
조건에 맞는지 안맞는지 체크를 해주는 제약조건이다. 조건과 맞지 않는다면 오류를 발생기킨다.
즉 입력할수 있는 값의 범위를 제한할 수 있다. NOT NULL처럼 이미 조건에 맞지 않는 데이터가 있는 컬럼에 적용하려하면 오류가 발생한다.
생성)
CREATE TABLE TEST(
id NUMBER(5),
name VARCHAR(20) CHECK (name IN ('원숭이', '호랑이'))
title VARCHAR(30)
-- 원숭이와 호랑이 두개의 값만 허용한다.
CREATE TABLE TEST(
id NUMBER(5),
name VARCHAR(20),
title VARCHAR(30),
CONSTRAINT id_check CHECK (id >= 1 AND id <= 10)
);
-- 들어오는 데이터 값의 범위를 지정해줄 수 있다.
테이블에 데이터를 추가할때 컬럼에 데이터를 넣지 않는다면 따로 무언가를 해주지 않았다면 NULL값이 들어간다. 그 이유는 DEFAULT의 값이 NULL로 설정되어 있기 때문이다.
생성)
CREATE TABLE TEST(
id NUMBER(5) PRIMARY KEY,
name VARCHAR(20) DEFAULT '김치'
title VARCHAR(30)
- name의 값을 정해주지 않는다면 기본값으로 김치가 들어간다.(숫자도 가능)
CREATE TABLE STORECATEGORIES(
SC_SGCODE NCHAR(10),
SC_CODE NCHAR(2),
SC_NAME NVARCHAR2(20)
)TABLESPACE USERS;
STORECATEGORIES 라는 테이블이 존재 한다는 가정에서
데이터를 일일이 삭제하기 번거로우기 때문에 값을 입력해줬던 반대 순서로 테이블을 삭제해주면 따로 손댈 필요없이 전부 삭제된다.(synonym제외)