Chap.8 테이블과 뷰[테이블] - 테이블 만들기, 제약 조건, 테이블 삭제, 테이블 수정
테이블
테이블 만들기, 제약 조건, 테이블 삭제, 테이블 수정
테이블 만들기
-
SQL로 테이블 만들기
DROP DATABASE IF EXISTS tableDB;
CREATE DATABASE tableDB;
USE tableDB;
DROP TABLE IF EXISTS buyTBL, userTBL;
CREATE TABLE userTBL -- 회원 테이블
( userID char(8), -- 사용자 아이디
name varchar(10), -- 이름
birthYear int, -- 출생연도
addr char(2), -- 지역(경기,서울,경남 등으로 글자만 입력)
mobile1 char(3), -- 휴대폰의국번(011, 016, 017, 018, 019, 010 등)
mobile2 char(8), -- 휴대폰의 나머지 젂화번호(하이픈 제외)
height smallint, -- 키
mDate date -- 회원 가입일
);
CREATE TABLE buyTBL -- 구매 테이블
( num int, -- 순번(PK)
userid char(8), -- 아이디(FK)
prodName char(6), -- 물품명
groupName char(4), -- 붂류
price int , -- 단가
amount smallint -- 수량
);
-
SQL로 테이블 만들기(NULL, NOT NULL 제약 조건) - 필수 요소
USE tableDB;
DROP TABLE IF EXISTS buyTBL, userTBL;
CREATE TABLE userTBL
( userID char(8) NOT NULL ,
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
);
CREATE TABLE buyTBL
( num int NOT NULL ,
userid char(8) NOT NULL ,
prodName char(6) NOT NULL,
groupName char(4) NULL ,
price int NOT NULL,
amount smallint NOT NULL
);
-
SQL로 테이블 만들기(PRIMARY KEY 제약 조건)
- PRIMARY KEY
-중복을 허용하지 않으며, NOT NULL 임
USE tableDB;
DROP TABLE IF EXISTS buyTBL, userTBL;
CREATE TABLE userTBL
( userID char(8) 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
);
CREATE TABLE buyTBL
( num int NOT NULL ,
userid char(8) PRIMARY KEY ,
prodName char(6) NOT NULL,
groupName char(4) NULL ,
price int NOT NULL,
amount smallint NOT NULL
);
-
SQL로 테이블 만들기(AUTO_INCREMENT)
- AUTO_INCREMENT
- 값을 지정하지 않은경우 자동 증가값이 지정
USE tableDB;
DROP TABLE IF EXISTS buyTBL, userTBL;
CREATE TABLE userTBL
( userID char(8) 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
);
CREATE TABLE buyTBL
( num int AUTO_INCREMENT NOT NULL PRIMARY KEY,
prodName char(6) NOT NULL,
groupName char(4) NULL ,
price int NOT NULL,
amount smallint NOT NULL
);
-
SQL로 테이블 만들기(FOREIN KEY)
- FOREIN KEY
- 다른 테이블에 대한 참조를 의미
- 참조되는 필드는 반드시 그 테이블에서 KEY여야 함(유일해야 함)
- FOREIGN KEY(필드명) REFERENCES 참조테이블명(참조테이블_필드명)
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,
groupName char(4) NULL ,
price int NOT NULL,
amount smallint NOT NULL,
FOREIGN KEY(userid) REFERENCES userTBL(userID)
);
-
데이터 삽입
INSERT INTO userTBL VALUES
('LSG', '이승기', 1987, '서울', '011', '1111111', 182, '2008-8-8');
INSERT INTO userTBL VALUES
('KBS', '김범수', 1979, '경남', '011', '2222222', 173, '2012-4-4');
INSERT INTO userTBL VALUES
('KKH', '김경호', 1971, '전남', '019', '3333333', 177, '2007-7-7');
INSERT INTO buyTBL VALUES(NULL, 'KBS', '운동화', NULL , 30, 2);
INSERT INTO buyTBL VALUES(NULL, 'KBS', '노트북', '전자', 1000, 1);
error 상황
INSERT INTO buyTBL VALUES(NULL, 'JYP', '모니터', '전자', 200, 1);
user TBL에 JYP가 없다. (∵FOREIN KEY)
제약 조건
-
데이터의 무결성을 지키기 위한 제한된 조건을 의미
- 값이 반드시 있어야 함
- 값이 중복되면 안됨 등
-
PRIMARY KEY 제약조건
-
FOREIGN KEY 제약조건
-
UNIQUE 제약조건
-
CHECK 제약조건
-
DEFAULT 정의
-
NULL 값 허용
-
CONSTRAINT로 제약조건에 명칭 부여 가능
- 에러 발생시 어떤 제약조건을 위배했는지 디버깅 하기 쉬움
- CONSTRAINT 제약조건 제약조건_명칭(컬럼명)
- 제약 조건 명칭 관례: 제약조건타입_테이블명_컬럼명
-
기본키(PRIMARY KEY) 제약조건
테이블당 1개의 컬럼에만 배정
값은 중복 될 수 없으며, NULL을 가질 수 없음
DROP TABLE IF EXISTS buyTBL, userTBL;
CREATE TABLE userTBL
(
userID CHAR(8) NOT NULL,
name VARCHAR(10) NOT NULL,
birthYear INT NOT NULL,
CONSTRAINT PRIMARY KEY PK_userTBL_userID (userID)
);
결과
PRIMARY KEY는 테이블당 1개만 존재하므로 일반적으로 제약조건명을 지정하지 않음
테이블 생성 이후 제약조건 추가
[형식]
ALTER TABLE 테이블명
ADD CONSTRAINT [제약조건명] PRIMARY KEY(컬럼명)
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); -- 복합키
PRIMARY KEY는 하나인데 prodCode, prodID 조합이 유일해야함
자동으로 인덱스 객체가 생성됨
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 PK_prodTbl_proCode_prodID
PRIMARY KEY (prodCode, prodID)
);
SHOW INDEX FROM prodTbl ;
결과
두 컬럼의 실행 소요 시간 비교
USE employees;
SELECT * FROM employees WHERE emp_no = 10838;
SELECT * FROM employees WHERE first_name = 'Deniz';
결과
속도차이 : emp_no는 PRIMARY KEY (index 정렬되어 있다. binary search)
-
외래 키(FOREIGN KEY) 제약조건(1)
- 두 테이블 사이의 관계를 선언함으로써, 데이터의 무결성을 보장
- 하나의 테이블(자식 테이블)이 다른 테이블(부모 테이블)에 의존하게 됨
- 자식 테이블에 외래 키가 존재
- 참조하는 부모 테이블에 반드시 값이 존재해야 함
⁃ 삽입/수정 시 부모 테이블에 값이 없다면 에러
- 자식 테이블에 참조하는 행이 있다면 해당 부모 테이블의 행은 삭제 불가
⁃ 삭제 시 에러 발생
⁃ 자식 테이블의 해당 값을 NULL로 바꾸거나, 먼저 자식 테이블의 행을 삭제
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,
FOREIGN KEY(userID) REFERENCES userTBL(userID)
);
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)
);
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
);
ALTER TABLE buyTBL
ADD CONSTRAINT FK_userTBL_buyTBL
FOREIGN KEY (userID) REFERENCES userTBL(userID);
SHOW INDEX FROM buyTBL ;
결과
-
외래 키(FOREIGN KEY) 제약조건(2)
- 부모 테이블의 행을 수정/삭제할 때- 그 행을 참조하는 자식 테이블에 대한 처리 옵션 지정
- ON DELETE CASECADE
⁃ 부모 행이 삭제될 때 자식 테이블의 행도 자동 삭제
- ON UPDATE CASECADE
⁃ 부모 수정 시 자식도 해당 값으로 자동 수정
- 디폴트
⁃ ON UPDATE NO ACTION
⁃ ON DELETE NO ACTION
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;
-
UNIQUE 제약조건
- 중복을 허용하지 않음
- NULL은 허용
cf) 키의 종류
- primary key
- unique key
- foreign key
USE tableDB;
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,
email CHAR(30) NULL UNIQUE
);
DROP TABLE IF EXISTS userTBL;
CREATE TABLE userTBL
( userID CHAR(8) NOT NULL PRIMARY KEY,
name VARCHAR(10) NOT NULL,
birthYear INT NOT NULL,
email CHAR(30) NULL ,
CONSTRAINT AK_email UNIQUE (email)
);
-
CHECK 제약조건
- 입력되는 데이터를 점검하는 기능
- 특정 값 중 하나인지, 음수인지, 출생연도가 1900년 이전인지 등 조사
-- 출생연도가 1900년 이후 그리고 2020년 이전, 이름은 반드시 넣어야 함.
DROP TABLE IF EXISTS userTBL;
CREATE TABLE userTBL
( userID CHAR(8) PRIMARY KEY,
name VARCHAR(10) ,
birthYear INT CHECK (birthYear >= 1900 AND birthYear <= 2020),
mobile1 CHAR(3) NULL,
CONSTRAINT CK_name CHECK ( name IS NOT NULL)
);
-- 휴대폰 국번 체크
ALTER TABLE userTbl
ADD CONSTRAINT CK_mobile1
CHECK (mobile1 IN ('010','011','016','017','018','019')) ;
-
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,
addr char(2) NOT NULL DEFAULT '서울',
mobile1 char(3) NULL,
mobile2 char(8) NULL,
height smallint NULL DEFAULT 170,
mDate date NULL
);
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;
ALTER TABLE userTBL
ALTER COLUMN addr SET DEFAULT '서울';
ALTER TABLE userTBL
ALTER COLUMN height SET DEFAULT 170;
-- default 문은 DEFAULT로 설정된 값을 자동 입력한다.
INSERT INTO userTBL VALUES
('LHL', '이혜리', default, default, '011', '1234567', default, '2022.12.12');
-- 열이름이 명시되지 않으면 DEFAULT로 설정된 값을 자동 입력한다
INSERT INTO userTBL(userID, name) VALUES('KAY', '김아영');
-- 값이 직접 명기되면 DEFAULT로 설정된 값은 무시된다.
INSERT INTO userTBL VALUES
('WB', '원빈', 1982, '대전', '019', '9876543', 176, '2023.5.5');
SELECT * FROM userTBL;
결과
-
임시 테이블
- 임시로 잠깐 사용되는 테이블
- 세션 내에서만 존재
- 세션: 로그인 해서 로그아웃 될 때까지의 기간
- 로그아웃 하면 임시 테이블은 자동으로 삭제
[형식]
CREATE TEMPORARY TABLE [IF NOT EXISTS] 테이블이름
(열 정의 …)
USE employees;
CREATE TEMPORARY TABLE IF NOT EXISTS tempTBL (id INT, name CHAR(7));
CREATE TEMPORARY TABLE IF NOT EXISTS employees (id INT, name CHAR(7));
DESCRIBE tempTBL;
DESCRIBE employees;
INSERT INTO tempTBL VALUES (1, 'This');
INSERT INTO employees VALUES (2, 'MariaDB');
SELECT * FROM tempTBL;
SELECT * FROM employees;
-- 로그아웃 후 다시 로그인
USE employees;
SELECT * FROM tempTBL;
SELECT * FROM employees;
테이블 삭제
[형식]
DROP TABLE 테이블명
외래키 제약조건이 있는 경우 자식 테이블을 먼저 삭제하거나, 제약조건 제거 후 실행해야 함
테이블 수정
-
열의 추가
USE tableDB;
ALTER TABLE userTBL
ADD homepage VARCHAR(30) -- 열추가
DEFAULT 'http://www.hanbit.co.kr' -- 디폴트값
NULL; -- Null 허용함
-
열의 삭제
ALTER TABLE userTBL
DROP COLUMN mobile1;
-
열의 수정
ALTER TABLE userTBL
CHANGE COLUMN name uName VARCHAR(20) NULL ;
float를 int로 변환하거나, 문자열의 길이를 줄이는 변환은 안된다.
-
제약조건의 삭제
ALTER TABLE userTBL
DROP PRIMARY KEY; -- 외래키 제약조건이 있으면 에러 발생
ALTER TABLE buyTBL
DROP FOREIGN KEY FK_userTBL_buyTBL;
댓글