데이터의 무결성을 지키기 위해, 데이터를 입력받을 때 실행되는 검사 규칙을 의미한다
null값을 허용하지 않는다
CREATE TABLE Test(
ID INT NOT NULL,
Name VARCHAR(30)
);
UNIQUE 조건이 설정된 필드는 중복된 값을 저장할 수 없다
CREATE TABLE Test(
ID INT NOT NULL,
Name VARCHAR(30) UNIQUE
);
-- table 생성 시 제약조건을 지정하는 방법
-- 1
CREATE TABLE article (
num INT AUTO_INCREMENT PRIMARY KEY,
title VARCHAR(50),
content VARCHAR(1000),
writer VARCHAR(20) REFERENCE user(id)
);
-- 2
CREATE TABLE article (
num INT AUTO_INCREMENT,
title VARCHAR(50),
content VARCHAR(1000),
writer VARCHAR(20),
PRIMARY KEY(num),
FOREIGN KEY(writer) REFERENCE user(id)
);
테이블의 기본 키이다
테이블의 데이터를 쉽고 빠르게 찾도록 도와주는 역할을 한다
NOT NULL, UNIQUE의 특성을 가진다
-- pk 지정
ALTER TABLE user ADD CONSTRAINT USER_PK PRIMARY KEY(id);
테이블의 외래 키이다
한 테이블을 다른 테이블과 연결해주는 역할을 한다
기준이 되는 테이블의 내용을 참조해서 레코드가 입력된다
참조되는 테이블의 컬럼은 반드시 UNIQUE 또는 PK로 지정되어 있어야 한다
-- fk 지정
ALTER TABLE article ADD CONSTRAINT ARTICLE_USER_FK
FOREIGN KEY(writer) REFERENCES user(id);
-- 'hong'이 참조 테이블(user)에 없으면 fk 제약조건 위배
INSERT INTO article VALUES(NULL, '제목', '내용', 'hong'); -- error
INSERT INTO article VALUES(NULL, '제목', '내용', NULL); -- ok, 단, null은 가능
INSERT INTO user VALUES ('hong', '홍길동'); -- error
INSERT INTO article VALUES(NULL, '제목', '내용', 'hong'); -- success 'hong'이 user의 id를 참조
-- 외부 테이블(article)에서 'hong'을 참조하고 있으면 삭제/변경할 수 없다
DELETE FROM user WHERE id='hong'; -- error
UPDATE user SET id='kong' WHERE id='hong'; -- error
UPDATE user SET NAME = '홍홍' WHERE id = 'hong'; -- ok, 참조하지 않는 컬럼의 내용 변경 가능
ALTER TABLE article DROP CONSTRAINT ARTICLE_USER_FK; -- fk 제약조건 삭제
INSERT INTO article VALUES(NULL, '송제목', '송내용', 'song'); -- ok
-- on delete cascade : B가 fk로 A을 가리키고 있을 때, A를 삭제하면 B도 같이 삭제되는 기능 (참조하는 모든 데이터 같이 삭제)
-- 설정하려는 fk 컬럼 데이터 중 제약조건에 위배되는 데이터가 있으면 제약조건을 지정할 수 없다
ALTER TABLE article ADD CONSTRAINT ARTICLE_USER_FK FOREIGN KEY(writer) REFERENCES user(id) ON DELETE CASCADE; -- error
UPDATE article SET writer='hong' WHERE writer<>'hong'; -- 'song'을 변경 후 다시 fk 지정시 ok
DELETE FROM user WHERE id='hong'; -- ok, user의 id, article의 writer가 'hong'인 데이터 모두 삭제됨
값의 범위 제한
CREATE TABLE temp3(
name VARCHAR(20) NOT NULL,
age INT DEFAULT 1 CHECK(age>0)
);
INSERT INTO temp3 (NAME) VALUES('hong');
INSERT INTO temp3 VALUES('kong', 1);
INSERT INTO temp3 VALUES('kong', -1); -- error