728x90
반응형
제약조건(constraint)
- 데이터를 입력받을 때 실행되는 검사 규칙
- CREATE 문으로 테이블을 생성 또는 ALTER 문으로 필드를 추가할 때 설정
- NOT NUL
- UNIQUE
- PRIMARY KEY → NOT NULL, UNIQUE, 한 테이블당 1개
- FOREIGN KEY
제약조건-NOT NULL
- defalut값은 nullable
- not null 제약조건이 설정된 필드는 무조건 데이터를 가지고 있어야 한다.
- CREATE TABLE author (
id INT NOT NULL,
name VARCHAR(30),
…);
- ALTER문을 써서 post의 title을 not null 조건으로 바꿔보자
- 이미 NULL인 데이터는 삭제
- AUTO_INCREMENT
- 새로운 레코드가 추가될 때마다 1씩 증가된 값을 저장
- 적용 후 마지막 인덱스(예:7)을 삭제후 다시 로우를 삽입하면 7로 채워지지 않고 8로 들어옴. (내부에서 따로 COUNT하기 때문)
ALTER TABLE post MODIFY COLUMN id INT AUTO_INCREMENT; INSERT INTO post (title) values ('오토'); select * from POST;
제약조건 - UNIQUE
- 해당 필드는 값이 unique해야 함을 의미
- CREATE TABLE 테이블이름 (필드명 필드타입 UNIQUE,…);
- CREATE TABLE 테이블이름(필드이름 필드타입, …, [CONSTRAINT 제약조건이름] UNIQUE (필드이름));
- UNIQUE 제약 조건을 별도로 정의하며, 선택적으로 제약 조건에 이름을 부여하는 방법
- UNIQUE 제약 조건을 설정하면, 해당 필드는 자동으로 인덱스(INDEX)로 설정
- show index from 테이블명; - 인덱스 조회
- index 삭제 : ALTER TABLE 테이블이름 DROP INDEX 인덱스명;
- 제약조건 삭제시 index도 함께 삭제됨, 제약조건 삭제 시 index도 삭제됨
- NULL값 입력 가능
실습
- UNIQUE ALTER문
- 방법 1(컬럼 제약조건)
ALTER TABLE 테이블이름 MODIFY COLUMN 필드이름 필드타입 UNIQUE
- 방법 2(테이블 제약조건 - 별도의 제약조건이름 옵션)
ALTER TABLE 테이블이름 ADD CONSTRAINT 제약조건이름 UNIQUE(필드이름)
- 제약조건 제거
- 제약조건 목록 조회
- ALTER TABLE 테이블명 DROP CONSTRAINT 제약조건이름;
- author 테이블 email에 unique 제약 조건 추가
- 컬럼 제약조건으로 추가
ALTER TABLE author MODIFY COLUMN email varchar(255) UNIQUE; describe author;
- 제약조건 제거 및 index 제거 (함께 제거됨)
SELECT * FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE WHERE TABLE_NAME = 'author'; -- 제약조건명 조회
ALTER TABLE author DROP CONSTRAINT email; SELECT * FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE WHERE TABLE_NAME = 'author';
- 테이블 제약조건 추가형식으로 추가
ALTER TABLE author ADD CONSTRAINT email_unique UNIQUE(email); SELECT * FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE WHERE TABLE_NAME = 'author'; describe author; SHOW INDEX FROM author;
제약조건 - PRIMARY KEY
- PRIMARY KEY 제약 조건을 가진 컬럼을 기본키(pk)라 함
- NOT NULL과 UNIQUE 제약 조건의 특징을 모두 가진다
- PRIMARY KEY는 테이블당 오직 하나의 필드에만 설정
- UNIQUE는 한 테이블의 여러 필드에 설정가능
- NOT NULL도 물론 여러 필드에 설정 가능
- 없던 PK를 설정하기 위한 ALTER문 예제
- 방법 1
ALTER TABLE 테이블이름 MODIFY COLUMN 필드이름 필드타입 PRIMARY KEY;
- 방법 2(별도의 제약조건이름 옵션)
ALTER TABLE 테이블이름 ADD CONSTRAINT 제약조건이름 PRIMARY KEY(필드이름);
제약조건 - FOREIGN KEY
- 외래키라고 부르며, 한 테이블을 다른 테이블과 연결해주는 역할
- 기준이 되는 다른 테이블의 내용을 참조해서 레코드가 입력
- 하나의 테이블을 다른 테이블에 의존하게 만드는 것
- 다른 테이블의 필드는 반드시 UNIQUE나 PRIMARY KEY WPDIRWHRJSDLDJDI GKA
- CREATE TABLE 테이블이름 {
필드이름 필드타입,
…,
[CONSTRAINT 제약조건이름]
FOREIGN KEY (필드이름) REFERENCES 테이블이름(필드이름) [ON DELETE/UPDATE CASCADE]);
- 참조되는 테이블에서 데이터의 수정이나 삭제가 발생시 영향
- ON DELETE
- ON UPDATE
- 기본값은 DELETE, UPDATE 모두 restrict 옵션이 걸려 있으므로 참조되는 테이블에 데이터가 있을 경우 delete, update불가능, 변경하고 싶다면 각각 지정필요
- 위 설정 시 동작 옵션
- CASCADE
- 참조되는 테이블에서 데이터를 삭제/수정하면 같이 삭제/수정
- SET NULL
- 참조되는 테이블에서 데이터를 삭제/수정하면 데이터는 NULL로 변경
- RESTRICT
- fk로 잡은 테이블의 데이터가 남아있으면, fk대상 데이터 수정/삭제 불가
- 동작 옵션을 주지 않으면 기본은 restrict
- CASCADE
제약조건 - ON UPDATE CASCADE
- 외래키 제약조건에서 ON UPDATE CASCADE 등의 옵션
- POST 테이블에 ON UPDATE CASCADE 설정
- 먼저, 기존의 foreign key제약조건을 조회 후 삭제
- SELECT * FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE WHERE TABLE_NAME = 'post';
- ALTER TABLE post DROP CONSTRAINT post_ibfk_1;
- ALTER TABLE post DROP INDEX post_ibfk_1;
- 새롭게 제약조건 추가
- ALTER TABLE post ADD CONSTRAINT post_author_fk FOREIGN KEY (author_id) REFERENCES author(id) ON UPDATE CASCADE;
- 테스트
- 삭제
- 삭제 불가 → ON DELETE는 CASCADE 적용 안했기 때문
- 수정
- author 테이블의 id 수정 시 post 테이블의 id도 같이 수정되는지 확인
post의 author_id는 각각 author의 id 1, 2번을 참조하고 있음
→ author의 id를 바꾸면 post의 author_id도 바뀌어야 함
- 삭제
- 먼저, 기존의 foreign key제약조건을 조회 후 삭제
제약조건 - ON DELETE CASCADE 실습
- 외래키 제약조건에서 ON DELETE CASCADE 등의 옵션
- ON DELETE CASCADE 테스트
- 삭제 시
- author 삭제 시 post 같이 삭제
- 수정 시
- author id 수정 불가 - ON UPDATE는 restrict기 때문
- 삭제 시
- ON DELETE CASCADE 테스트
- ON DELETE SET NULL, ON UPDATE SET NULL 또한 동일 방법으로 테스트
SELECT * FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE WHERE TABLE_NAME = 'post';
ALTER TABLE post DROP CONSTRAINT post_author_fk; -- 위에서 조회한 Constraint_NAME
SHOW INDEX FROM post;
ALTER TABLE post DROP INDEX post_author_fk; -- CONSTRAINT_NAME과 같음
ALTER TABLE post ADD CONSTRAINT post_author_fk2 FOREIGN KEY (author_id) REFERENCES author(id) ON UPDATE SET NULL ON DELETE SET NULL;
SELECT * FROM post;
SELECT * FROM author;
author를 20을 지우면 post id가 1인 author_id는 null이 될 것
제약조건 - DEFAULT
- 데이터를 입력할 때 해당 필드 값을 전달하지 않으면, 자동으로 설정된 기본값을 저장
- CREATE TABLE Test {
id INT,
name VARCHAR(30) DEFAULT ‘Anoymous’);
- 시간 세팅 시 가장 많이 사용
- ALTER TABLE author ADD create_at DATETIME DEFAULT CURRENT_TIMESTAMP;
- ALTER TABLE post ADD create_at DATETIME DEFAULT CURRENT_TIMESTAMP;
Uploaded by N2T
728x90
반응형
'Database' 카테고리의 다른 글
[MariaDB] 동시성 이슈 (1) | 2023.11.22 |
---|---|
[MariaDB] 흐름제어 (0) | 2023.11.22 |
[MariaDB] 연산자 (1) | 2023.11.22 |
[MariaDB] 데이터타입 (0) | 2023.11.22 |
[MariaDB] DML (1) | 2023.11.22 |