반응형

[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

반응형
반응형

[MariaDB] 마리아DB[MariaDB] 마리아DB 테이블 - 외래키 제약조건(FOREIGN KEY) (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 값 허용

이번 포스팅에서는 외래키 제약조건에 대해서 설명하겠습니다.

 

외래키 제약조건

외래키 제약조건은 두 테이블 사이의 관계를 선언함으로써, 데이터의 무결성을 보장해 주는 역할을 합니다.

외래 키 관계를 설정하면 하나의 테이블이 다른 테이블에 의존하게 됩니다.

 

외래키 테이블에 데이터를 입력할 때는 꼭 기준 테이블을 참조해서 입력하므로, 기준 테이블에 이미 데이터가 존재해야 합니다.

기준 테이블의 기본키 열에 있는 값들만 현재테이블의 외래키 값으로 사용할 수 있고 다른 값을 넣으면 에러가 발생합니다.

 

외래키 테이블이 참조하는 기준 테이블의 열은 반드시 PRIMARY KEY(기본키)이거나, UNIQUE 제약 조건이 설정되어 있어야 합니다.

 

외래키 설정 방법은 아래 코드처럼 외래키 테이블에서 설정을 합니다.

DROP TABLE IF EXISTS buyTBL, userTBL;	-- 테이블이 존재할 경우 삭제(DROP)
CREATE TABLE userTBL 
( userID  CHAR(8) NOT NULL PRIMARY KEY, 	-- 기본키로 설정, 기본키는 반드시 NOT NULL
  name    VARCHAR(10) NOT NULL, 
  birthYear   INT NOT NULL 
);
CREATE TABLE buyTBL 
(  num INT AUTO_INCREMENT NOT NULL PRIMARY KEY , 	-- 기본키, NOT NULL, 자동증가 설정
   userID  CHAR(8) NOT NULL, 
   prodName CHAR(6) NOT NULL,
   FOREIGN KEY(userID) REFERENCES userTBL(userID)	-- 이 테이블의 외래키는 userID이고, userTBL 테이블의 userID 와 연결
);

 

외래키의 이름을 "FK_기준테이블명_외래키있는테이블명"으로 설정해두면 나중에 이름만 보고도 어떤 관계인지 알 수가 있습니다.

이렇게 외래키의 이름을 입력하고 싶다면 아래 처럼 "CONSTRAINT 외래키이름"을 추가해주면 됩니다.

(입력을 안할 경우 자동으로 이름이 랜덤하게 생성됨)

DROP TABLE IF EXISTS buyTBL;
CREATE TABLE buyTBL 
(  num INT AUTO_INCREMENT NOT NULL PRIMARY KEY , 
   userID  CHAR(8) NOT NULL, 
   prodName CHAR(6) NOT NULL,
   CONSTRAINT FK_userTBL_buyTBL FOREIGN KEY(userID) REFERENCES userTBL(userID)	-- CONSTRAINT 외래키이름 
);

 

생성된 외래키 이름이 잘 들어갔는제 SELECT문으로 확인해 봅니다.

select * from information_schema.table_constraints where table_name = 'buyTBL';	-- 테이블 정보확인

외래키 이름 확인

 

이미 생성된 테이블에 외래키를 지정하는 방법도 존재합니다.

ALTER TABLE 구문을 이용하는 방법입니다.

DROP TABLE IF EXISTS buyTBL, userTBL;
CREATE TABLE userTBL 
( userID  CHAR(8) NOT NULL PRIMARY KEY, 
  name    VARCHAR(10) NOT NULL, 
  birthYear   INT NOT NULL 
);
CREATE TABLE buyTBL 
(  num INT AUTO_INCREMENT NOT NULL PRIMARY KEY,
   userID  CHAR(8) NOT NULL, 
   prodName CHAR(6) NOT NULL 
);
ALTER TABLE buyTBL	-- 테이블 수정
    ADD CONSTRAINT FK_userTBL_buyTBL 	-- 제약조건 추가. 외래키 이름을 설정
    FOREIGN KEY (userID) 	-- 외래키 제약조건을 userID에 설정
    REFERENCES userTBL(userID);	-- 참조할 기준 테이블은 userTBL 테이블의 userID 열로 설정

 

외래키 옵션중에 ON DELETE CASCADE 또는 ON UPDATE CASCADE가 있습니다.

이는 기준 테이블의 데이터 값이 변경되었을때 외래키 테이블의 데이터 값도 자동으로 변경되도록 설정해줍니다.

 

예를들어 ON UPDATE CASCADE로 설정했을경우 기준테이블의 참조된 기본키값이 "AAA"에서 "BBB"로 수정된다면 외래키가 설정된 테이블의 외래키값도 "BBB"로 자동으로 수정됩니다.

 

설정방법은 아래 코드 처럼 값을 넣어 줍니다.

ALTER TABLE buyTBL
	DROP FOREIGN KEY FK_userTBL_buyTBL; -- (외래키명) 외래 키 제거

ALTER TABLE buyTBL
	ADD CONSTRAINT FK_userTBL_buyTBL
	FOREIGN KEY (userID)
	REFERENCES userTBL (userID)
	ON UPDATE CASCADE;	-- 기준 테이블의 참조된 기본키값이 변경 시 buyTBL의 userID 값도 함께 변경

 

 

[MariaDB] 전체보기

 

'MariaDB' 카테고리의 글 목록

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

reddb.tistory.com

반응형
반응형

[MariaDB] 마리아DB 테이블 - 기본키 제약조건(PRIMARY KEY) (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 값 허용

이번 포스팅에서는 기본키 제약조건에 대해서 설명하겠습니다.

 

기본키 제약조건

기본키는 중복될 수 없는 열의 유일한 값이어야 하며, NULL 값이 입력될 수 없습니다. 

기본키를 생성하는 방법은 앞서 설명드린 포스팅과 같이 CREATE TABLE문에서 PRIMARY KEY라는 예약어를 넣어주면 됩니다.

DROP TABLE IF EXISTS buyTBL, userTBL;	-- 이전 포스팅에서 생성한 테이블(buyTBL, userTBL)이 존재하면 삭제(DROP)
CREATE TABLE userTBL 	-- userTBL 테이블 생성
( userID  CHAR(8) NOT NULL PRIMARY KEY, 	-- 기본키를 생성, 기본키는 반드시 not null 이어야 함.
  name    VARCHAR(10) NOT NULL, 
  birthYear   INT NOT NULL
);

 

DESCRIBE userTBL; 쿼리를 실행하면 userID가 기본키가 된 것을 확인할 수 있습니다. 

테이블 확인

 

이미 생성된 테이블에 기본키를 지정하고 싶을때는 아래처럼 ALTER 문으로 기본키 지정이 가능합니다.

DROP TABLE IF EXISTS userTBL;
CREATE TABLE userTBL 
(   userID  CHAR(8) NOT NULL, 
    name    VARCHAR(10) NOT NULL, 
    birthYear   INT NOT NULL
);
ALTER TABLE userTBL	-- userTBL 테이블 변경
	ADD CONSTRAINT PRIMARY KEY (userID);	-- 추가 강제 기본키 (열이름)

 

또한, 단순이 하나의 열을 기본키로 지정하는게 아니라 두개의 열을 합쳤을 때 중복되는 값이 없다면 두개의 열을 기본키로 지정 할 수도 있습니다.

-- 방법1 (테이블 생성 시 지정)
DROP TABLE IF EXISTS prodTbl;
CREATE TABLE prodTbl
( prodCode CHAR(3) NOT NULL,
  prodID   CHAR(4)  NOT NULL,
  prodDate DATETIME  NOT NULL,
  prodCur  CHAR(10) NULL,
  CONSTRAINT PRIMARY KEY (prodCode, prodID) 	-- 기본키를 (prodCode, prodID) 두개 열로 지정
);



-- 방법2 (테이블 생성 후 ALTER 문으로 추가 지정)
DROP TABLE IF EXISTS prodTbl;
CREATE TABLE prodTbl
( prodCode CHAR(3) NOT NULL,
  prodID   CHAR(4)  NOT NULL,
  prodDate DATETIME  NOT NULL,
  prodCur  CHAR(10) NULL
);
ALTER TABLE prodTbl
	ADD CONSTRAINT PRIMARY KEY (prodCode, prodID) ;	-- 기본키를 (prodCode, prodID) 두개 열로 지정

두개의 열을 기본키로 설정

 

SHOW INDEX FROM prodTbl; 문으로 테이블의 정보를 확인하면 두 열이 합쳐져서 하나의 기본키 제약조건을 설정한 것을 확인할 수 있습니다.

SHOW INDEX FROM 테이블명;

 

 

[MariaDB] 전체보기

 

'MariaDB' 카테고리의 글 목록

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

reddb.tistory.com

반응형
반응형

[MariaDB] 마리아DB 테이블 - SQL로 테이블 생성 및 기본키 외래키 설정 (MySQL)

 

userTBL 테이블 생성

테이블 명세서

userID  char(8) NOT NULL PRIMARY KEY, -- 사용자 아이디
name    nvarchar(10) NOT NULL, -- 이름
birthYear   int NOT NULL,  -- 출생연도
addr   nchar(2) NOT NULL, -- 지역(경기,서울,경남 등으로 글자만 입력)
mobile1 char(3) NULL, -- 휴대폰의국번(011, 016, 017, 018, 019, 010 등)
mobile2   char(8) NULL, -- 휴대폰의 나머지 전화번호(하이픈 제외)
height    smallint NULL,  -- 키
mDate    date NULL  -- 회원 가입일

 

쿼리 입력창에서 아래 쿼리를 입력 후 실행합니다.

DROP TABLE IF EXISTS userTBL; -- userTBL 테이블이 존재한다면 삭제(DROP)
CREATE TABLE userTBL	-- 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 	-- 널값 허용
);

 

 

buyTBL 테이블 생성

테이블 명세서

num int AUTO_INCREMENT NOT NULL PRIMARY KEY ,  -- 순번(기본키, 자동 증가)
userid  char(8) NOT NULL ,   -- 아이디(외래키)
prodName char(6) NOT NULL,  -- 물품명
groupName char(4) NULL ,    -- 분류
price     int  NOT NULL,   -- 단가
amount    smallint  NOT NULL,  -- 수량
FOREIGN KEY(userid) REFERENCES userTBL(userID)  -- 현재테이블(buyTBL) 외래키(userid)와 userTBL테이블 기본키(userID)를 연결


쿼리 입력창에서 아래 쿼리를 입력 후 실행합니다.

DROP TABLE IF EXISTS buyTBL;	-- buyTBL 테이블이 존재하면 삭제(DROP)
CREATE TABLE buyTBL 	-- buyTBL 테이블 생성
(  num int AUTO_INCREMENT NOT NULL PRIMARY KEY , 	-- 자동 상승, 낫널, 기본키 설정 (자동상승은 기본키만 가능)
   userid  char(8) NOT NULL ,
   prodName char(6) NOT NULL,
   groupName char(4) NULL , 	-- 널값 허용
   price     int  NOT NULL,	
   amount    smallint  NOT NULL,
   FOREIGN KEY(userid) REFERENCES userTBL(userID) -- 현재 테이블의 userid를 외래키로 하고 userTBL 테이블의 userID(기본키)를 연결
);

 

 

자료 입력하기

userTBL 테이블에 아래 쿼리를 입력하여 데이터 INSERT 합니다.

INSERT INTO userTBL VALUES('aaa', N'에이', 1997, N'서울', '010', '1111111', 185, '2007-8-8');
INSERT INTO userTBL VALUES('bbb', N'비', 1999, N'경남', '010', '2222222', 175, '2011-4-4');
INSERT INTO userTBL VALUES('ccc', N'씨', 1991, N'전남', '010', '3333333', 176, '2008-7-7');

 

buyTBL 테이블에 아래 쿼리를 입력 할때 외래키-기본키 연결 상태이기 때문에,

buyTBL 외래키(userid)는 반드시 userTBL에 입력(INSERT)되어 있는 aaa, bbb, ccc 중에 하나를 넣어야 합니다. (아닌 경우 에러 발생)

INSERT INTO buyTBL VALUES(NULL, 'aaa', N'운동화', NULL  , 30,   2);	-- 정상입력
INSERT INTO buyTBL VALUES(NULL, 'bbb', N'노트북', N'전자', 1000, 1);	-- 정상입력
INSERT INTO buyTBL VALUES(NULL, 'ddd', N'모니터', N'전자', 200,  1);	-- 오류발생(userTBL 기본키에 없는 값)

 

 

[MariaDB] 전체보기

 

 

'MariaDB' 카테고리의 글 목록

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

reddb.tistory.com

반응형
반응형

[MariaDB] 마리아DB 테이블 - HeidiSQL로 테이블 생성 및 기본키 외래키 설정 (MySQL)

 

userTBL 테이블 생성

테이블 명세서

userID  char(8) NOT NULL PRIMARY KEY, -- 사용자 아이디
name    nvarchar(10) NOT NULL, -- 이름
birthYear   int NOT NULL,  -- 출생연도
addr   nchar(2) NOT NULL, -- 지역(경기,서울,경남 등으로 글자만 입력)
mobile1 char(3) NULL, -- 휴대폰의국번(011, 016, 017, 018, 019, 010 등)
mobile2   char(8) NULL, -- 휴대폰의 나머지 전화번호(하이픈 제외)
height    smallint NULL,  -- 키
mDate    date NULL  -- 회원 가입일

 

 

HeidiSQL 접속 후 DB 선택 후 마우스 우클릭 - 새로생성(O) - 테이블(U) 클릭하여 테이블 생성합니다.

테이블생성

 

이름 입력, 추가 클릭하여 열 생성(이름, 유형, 길이, 널허용 등), 저장 클릭합니다.

테이블 정보 입력

 

userID에서 마우스 우클릭 후 - 새 인덱스 생성(Y) - PRIMARY 클릭 - 저장 합니다. (기본키 설정)

userID 기본키 설정

 

buyTBL 테이블 생성

테이블 명세서

num int AUTO_INCREMENT NOT NULL PRIMARY KEY ,  -- 순번(기본키, 자동 증가)
userid  char(8) NOT NULL ,   -- 아이디(외래키)
prodName char(6) NOT NULL,  -- 물품명
groupName char(4) NULL ,    -- 분류
price     int  NOT NULL,   -- 단가
amount    smallint  NOT NULL,  -- 수량
FOREIGN KEY(userid) REFERENCES userTBL(userID)  -- 현재테이블(buyTBL) 외래키(userid)와 userTBL테이블 기본키(userID)를 연결

 

 

HeidiSQL 접속 후 DB 선택 후 마우스 우클릭 - 새로생성(O) - 테이블(U) 클릭하여 테이블 생성합니다.

테이블 생성

 

이름 입력, 추가 클릭하여 열 생성(이름, 유형, 길이, 널허용 등), 저장 클릭합니다.

테이블 설정

 

num열을 기본값으로 먼저 설정해줍니다. (기본값으로 설정하지 않으면 AUTO_INCREMENT 설정이 불가능)

num에서 마우스 우클릭 - 새 인덱스 생성(Y) - PRIMARY 선택 - 저장 합니다.

기본키설정

 

num열의 기본값을 클릭 후 - AUTO_INCREMENT 선택 - 확인 클릭 - 저장 클릭합니다.

자동증가 선택

 

buyTBL의 외래 키 탭을 선택 후 - 추가 클릭 - 키이름을 원하는 이름을 변경하고 - 열은 외래키인 "userid" 선택 - 참조 테이블은 userTBL 선택 - 외래 열은 "userID 선택" - 저장을 클릭합니다.

참조 설정

 

자료 입력하기

userTBL 테이블의 데이터 탭을 선택하고 + 버튼을 클릭해서 자료를 입력합니다.

userTBL 자료입력

 

buyTBL 테이블 데이터 탭에서 자료를 입력하려고 하면 외래키 적용으로 userTBL의 userID만 선택 가능합니다.

외래키가 적용된 상태로 userid는 선택입력

 

 

[MariaDB] 전체보기

 

'MariaDB' 카테고리의 글 목록

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

reddb.tistory.com

반응형