[SQL] CONSTRAINT 제약조건

SeonJin·2023년 9월 10일
0

SQL

목록 보기
3/4
post-custom-banner

제약조건

데이터의 무결성을 지키기 위해, 데이터를 입력받을 때 실행되는 검사 규칙을 의미한다

not null

null값을 허용하지 않는다

CREATE TABLE Test(
    ID INT NOT NULL,
    Name VARCHAR(30)
);

unique

UNIQUE 조건이 설정된 필드는 중복된 값을 저장할 수 없다

CREATE TABLE Test(
    ID INT NOT NULL,
    Name VARCHAR(30) UNIQUE
);

PK / FK

-- 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)
);

primary key

테이블의 기본 키이다
테이블의 데이터를 쉽고 빠르게 찾도록 도와주는 역할을 한다
NOT NULL, UNIQUE의 특성을 가진다

-- pk 지정
ALTER TABLE user ADD CONSTRAINT USER_PK PRIMARY KEY(id);

foreien key

테이블의 외래 키이다
한 테이블을 다른 테이블과 연결해주는 역할을 한다
기준이 되는 테이블의 내용을 참조해서 레코드가 입력된다
참조되는 테이블의 컬럼은 반드시 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'인 데이터 모두 삭제됨

check

값의 범위 제한

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
profile
study notebook
post-custom-banner

0개의 댓글