반응형

[MariaDB] 마리아DB 테이블 - UNIQUE, CHECK, DEFAULT, NULL 제약조건 (MySQL)

 

MariaDB는 데이터의 무결성을 위해서 다음의 6가지 제약조건을 제공합니다.

  1. PRIMARY KEY 제약조건
  2. FOREIGN KEY 제약조건
  3. UNIQUE 제약 조건
  4. CHECK 제약조건(MariaDB 10.2.1부터 지원, MySQL 8.0.16부터 지원)
  5. DEFAULT 정의
  6. NULL 값 허용

이번 포스팅에서는 UNIQUE, CHECK, DEFAULT NULL 제약조건에 대해서 설명하겠습니다.



UNIQUE 제약조건

UNIQUE 제약조건은 중복되지 않는 유일한 값을 입력해야 하는 조건 입니다.

이것은 기본키와 거의 비슷하지만 차이점은 UNIQUE는 NULL 값을 허용합니다.

대표적으로 E-MAIL 열을 UNIQUE로 많이 사용합니다.

 

아래는 테이블 생성시 UNIQUE 제약조건을 넣는 방법 2가지 예 입니다.

USE DB명;	-- 사용할 DB선택

-- UNIQUE 제약 방법1
DROP TABLE IF EXISTS buyTBL, userTBL;	-- 테이블이 존재하면 삭제
CREATE TABLE userTBL 	-- 테이블 생성
( userID  CHAR(8) NOT NULL PRIMARY KEY, 	-- 기본키, NOT NULL
  name    VARCHAR(10) NOT NULL, 
  birthYear   INT NOT NULL,  
  email   CHAR(30) NULL  UNIQUE	-- UNIQUE, NULL 허용
);

-- UNIQUE 제약 방법2
DROP TABLE IF EXISTS userTBL;	-- 테이블이 존재하면 삭제
CREATE TABLE userTBL 	-- 테이블 생성
( userID  CHAR(8) NOT NULL PRIMARY KEY,	-- 기본키, NOT NULL
  name    VARCHAR(10) NOT NULL, 
  birthYear   INT NOT NULL,  
  email   CHAR(30) NULL ,  	-- NULL 허용
  CONSTRAINT AK_email  UNIQUE (email)	-- 이름을 AK_email로 변경하고 UNIQUE로 제약(email을)
);

 

 

CHECK 제약조건

CHECK 제약 조건은 데이트럴 점검하는 기능입니다.

열 값이 입력될 때 특정 수치 이상은 입력을 못하게 막거나, 특정 시점 이후의 날짜만 입력가능하게 하거나 하는 조건을 걸수 있습니다.

 

아래는 출생년도의 제약조건과, 이름의 공란을 허용하지 않도록 하는 예제입니다.

DROP TABLE IF EXISTS userTBL;	-- 테이블이 존재하면 삭제
CREATE TABLE userTBL 	-- 테이블 생성
( userID  CHAR(8) PRIMARY KEY,	-- 기본키
  name    VARCHAR(10) , 
  birthYear  INT CHECK  (birthYear >= 1900 AND birthYear <= 2020),	-- CHECK 제약조건 (생년이 1900이상 2020이하)
  mobile1	char(3) NULL, 
  CONSTRAINT CK_name CHECK ( name IS NOT NULL)  	-- name의 이름을 CK_name으로 변경, NOT NULL로 변경
);

 

다음은 위에서 만든 mobile1(국번)에 CHECK 제약조건으로 수정하는 방법입니다.

ALTER TABLE userTbl	-- 테이블 변경
	ADD CONSTRAINT CK_mobile1	-- 추가, 이름을 CK_mobile1로 변경
	CHECK  (mobile1 IN ('010','011','016',,'019')) ;	-- mobile1 안에 값은 010, 011, 016, 019만 입력되도록 제약

 

CHECK 제약 조건을 설정한 후에는, 제약조건에 위배되는 값은 입력이 안됩니다.

CHECK 제약 조건을 무시하려면 시스템 변수 중 check_constraint_checks 값을 0으로 설정해야 합니다.

SET check_constraint_checks = 0;	-- CHECK 제약조건 비활성화
SET check_constraint_checks = 1;	-- CHECK 제약조건 활성화

 

 

DEFAULT 정의

DEFAULT는 값을 입력하지 않을 경우, 자동으로 입력되는 기본값을 정의 하는 방법입니다.

아래 예는 출생연도를 입력하지 않으면 -1을 입력,

주소를 입력하지 않으면 "경기도"을 입력,

키를 입력하지 않으면 "175"가 입력되도록 한 DEFAULT 정의 입니다.

DROP TABLE IF EXISTS userTBL;	-- 테이블이 존재하면삭제
CREATE TABLE userTBL 	-- 테이블 생성
( userID  	char(8) NOT NULL PRIMARY KEY,  
  name    	varchar(10) NOT NULL, 
  birthYear	int NOT NULL DEFAULT -1,	-- NOT NULL, 디폴트값 -1
  addr	  	char(2) NOT NULL DEFAULT '경기도',	-- NOT NULL, 디폴트값 경기도
  mobile1	char(3) NULL, 
  mobile2	char(8) NULL, 
  height	smallint NULL DEFAULT 175, 	-- NULL 허용, 디폴트값 175
  mDate    	date NULL
);

 

다른 방법으로는 ALTER 테이블로 변경하는 방법도 있습니다.

DROP TABLE IF EXISTS userTBL;
CREATE TABLE userTBL 
( userID	char(8) NOT NULL PRIMARY KEY,  
  name		varchar(10) NOT NULL, 
  birthYear	int NOT NULL ,
  addr		char(2) NOT NULL,
  mobile1	char(3) NULL, 
  mobile2	char(8) NULL, 
  height	smallint NULL, 
  mDate	date NULL 
);
ALTER TABLE userTBL	-- 테이블 변경
	ALTER COLUMN birthYear SET DEFAULT -1;	-- 출생연도 디폴트값 -1
ALTER TABLE userTBL
	ALTER COLUMN addr SET DEFAULT '경기도';	-- 주소 디폴트값 경기도
ALTER TABLE userTBL
	ALTER COLUMN height SET DEFAULT 175;	-- 키 디폴트값 175

 

디폴트값이 설정된 열에는 아래와 같은 방법으로 데이터 입력이 가능합니다.

-- default 문은 DEFAULT로 설정된 값을 자동 입력됩니다.
INSERT INTO userTBL VALUES ('KHJ', '김혜정', default, default, '011', '1234567', default, '2021.11.11');

-- 열이름이 명시되지 않으면 DEFAULT로 설정된 값을 자동 입력됩니다.
INSERT INTO userTBL(userID, name) VALUES('LKJ', '이경진');

-- 모든 값을 직접 입력하면 DEFAULT로 설정된 값은 무시됩니다.
INSERT INTO userTBL VALUES ('PSH', '박수환', 1981, '서울', '019', '9876543', 176, '2022.4.2');

 

 

NULL 값 허용

열 값에 NULL을 허용할지 허용하지 않을 지를 정할 수 있습니다. (NULL, NOT NULL)

PRIMARY KEY(기본키)의 경우는 반드시 NOT NULL 이어야 합니다.

PRIMARY KEY(기본키)열에 NOT NULL을 생략해도 NOT NULL로 인식됩니다.

다른열은 생략하면 NULL로 인식합니다.

NULL은 값이 아무것도 없다는 의미입니다. 0, ' '(공백)과는 의미가 다릅니다.

 

 

[MariaDB] 전체보기

 

 

'MariaDB' 카테고리의 글 목록

전산 관련 경험을 기록 하는 곳

reddb.tistory.com

반응형