본문 바로가기

데이터분석/SQL

SQL 첫걸음 - 제약

- 제약조건은 데이터의 무결성을 지키기 위해 제한하는 조건

- 제약은 테이블에 설정하는 것.

AUTO_INCREMENT 새 행 생성(행 데이터가 추가될 때 마다) 자동으로 1씩 증가 + PRIMARY KEY
PRIMARY KEY 오직 하나의 기본키만 가질 수있음(중복 입력 불가), NULL(빈 값) 입력 불가(무조건 값이 있어야함)
FOREIGN KEY 필수 X, 참조
UNIQUE 중복 입력 불가
NOT NULL NULL(빈 값) 입력 불가(무조건 값이 있어야함), NULL값이 저장되지 않도록 제한
UNSIGNED (숫자일시) 양수만 가능
DEFAULT 정의 값 입력이 없을 시 기본값

 

1. 테이블 작성시 제약 정의

CREATE TABLE sample631(
	a INTEGER NOT NULL,
    b INTEGER NOT NULL UNIQUE,
    c VARCHAR(30)
);

테이블 열에 제약 정의하기

- a열 : NOT NULL제약

- b열 : NOT NULL제약, UNIQUE제약

- 열 제약 : 열에 대해 정의하는 제약 

 

CREATE TABLE sample632 (
    no INTEGER NOT NULL,
    sub_no INTEGER NOT NULL,
    name VARCHAR(30),
    PRIMARY KEY(no, sub_no)
);

테이블에 '테이블 제약' 정의하기

- 테이블 제약 : 한 개의 제약으로 복수의 열에 제약을 설명하는 경우

 

CREATE TABLE sample632 (
	no INTEGER NOT NULL,
    sub_no INTEGER NOT NULL,
    name VARCHAR(30),
    CONSTRAINT pkey_sample PRIMARY KEY (no, sub_no)
);

'테이블 제약'에 이름 붙이기

- 제약에는 이름을 붙일 수 있음. 제약에 이름을 붙이면 나중에 관리하기 쉬워지므로 가능한 이름을 붙이는게 남

- 제약 이름은 CONSTRAINT 키워드를 사용해서 지정함

 

2. 제약 추가

- 기존 테이블도 나중에 제약을 추가할 수 있음

열 제약 추가

ALTER TABLE sample631 MODIFY c VARCHAR(30) NOT NULL;

c열에 NOT NULL 제약 걸기

- 열 제약을 추가할 경우 ALTER TABLE로 열 정의 변경 가능

- 기존 테이블을 변경할 경우에는 제약을 위반하는 데이터가 없는지 먼저 검사

- 만약 c열에 NULL이 존재한다면 위 ALTER TABLE 명령은 에러 발생

 

테이블 제약 추가

ALTER TABLE sample631 ADD CONSTRAINt pkey_sample631 PRIMARY KEY(a);

기본키 제약 추가하기

- 테이블 제약은 ALTER TABLE의 ADD 하부명령으로 추가가능

- 기본키는 테이블에 하나만 설정할 수 있음

- 이미 기본키가 설정되어 있는 테이블에 추가로 기본키를 작성할 수는 없음

- 기존 테이블을 변경할 경우에는 제약을 위반하는 데이터가 없는지 먼저 검사, 추가할 제약을 위반하는 데이터가 있으면 에러 발생

 

3. 제약 삭제

열 제약 삭제

ALTER TABLE sample631 MODIFY c VARCHAR(30);

c열의 NOT NULL제약 없애기

 

테이블 제약 삭제

ALTER TABLE sample631 DROP CONSTRAINT pkey_sample631;

pkey_sample631 제약 삭제

ALTER TABLE sample631 DROP PRIMARY KEY;

기본키 제약 삭제하기

- 기본키는 테이블 당 하나만 설정할 수 있기에 위처럼 제약명을 지정하지 않고도 삭제 가능

 

4. 기본키

- NOT NULL : 열 제약

- 기본키 제약 : 테이블 제약

CREATE TABLE sample634(
	p INTEGER NOT NULL,
    a VARCHAR(30),
    CONSTRAINT pkey_sample634 PRIMARY KEY(p)
);

sample634 테이블 작성

- p가 sample634 테이블의 기본키, 기본키로 지정할 열은 NOT NULL 제약이 설정되어 있어야 함

- 대량의 데이터에서 원하는 데이터를 찾아낼 때 키가 되는 요소를 지정해 검색

- 기본키는 테이블의 행 한 개를 특정할 수 있는 검색키, 기본키 제약이 설정된 테이블에서는 기본키로 검색했을 때 복수의 행이 일치하는 데이터 작성 불가

- 기본키로 설정된 열이 중복하는 데이터 값을 가지면 제약에 위반됨

INSERT INTO sample634 VALUES (1, '첫째줄');
INSERT INTO sample634 VALUES (2, '둘째줄');
INSERT INTO sample634 VALUES (3, '셋째줄');

sample634에 행 추가

- p열의 값이 각각 1,2,3으로 중복되지 않음

INSERT INTO sample634 VALUES (2, '넷째줄');

sample634에 중복하는 행 추가하기

- '기본키 제약에 위반된다'는 에러발생 : 이미 존재하는 값인 2로 다시 한 번 행을 추가해서

UPDATE sample634 SET p=2 WHERE p=3;

sample634에 중복된 값으로 갱신하기

- UPDATE 명령 역시 제약에 위반되므로 실행되지 않음 : p가 3인 행을 2로 갱신하는데 성공하면 p=2인 열이 두개가 존재하기 때문

- 기본키 제약(유일성 제약) : 열을 기본키로 지정해 유일한 값을 가지도록하는 구조

* 기본키 제약이 설정된 열에는 중복된 값을 저장힐 수 없음!

 

복수의 열로 기본키 구성하기

- 기본키로는 NULL값이 허용되지 않음

- 기본키를 구성하는 열은 복수라도 상관없음

- 복수의 열을 기본키로 지정했을 경우, 키를 구성하는 모든 열을 사용해서 중복하는 값이 있는지 없는지를 검사

SELECT a, b FROM sample635;

a열과 b열로 이루어진 기본키

- a열만 봤을 때는 중복하는 값이 있지만 b열이 다르면 키 전체로서 중복하지 않는다고 간주됨 ➡️ 기본키 제약 위반 X

- 이 상태에서 키가 완전히 동일한 데이터 값으로 INSERT 명령을 실해하면 기본키 제약 위반