데이터 베이스 키의 종류를 알아보자.
유투브에 대멀쌤이라는 영상을 보게 되었다.
후보키는 외 기본키가 대슈?
일단, 키의 종류에는 5가지가 있고, 아래와 같은 구조를 따른다.
기본키는 후보키 중에서 행을 식별하기 위해 특별히 선택된 키를 말한다.
기본키는 중복될 수 없으며, NULL값이 올 수 없다.
유일성과 최소성을 만족해야 한다.
UNIQUE는 한 테이블의 여러 필드에 설정할 수 있다.
PRIMARY KEY는 테이블당 오직 하나의 필드에만 설정할 수 있다.
PRIMARY KEY 제약 조건은 테이블의 데이터를 쉽고 빠르게 찾도록 도와주는 역할을 한다.
외래키 예제
create table department(
id int auto_increment primary key,
name varchar(20) not null,
code char(13) not null unique key
);
create table employee(
id int auto_increment primary key,
name varchar(20) not null,
code char(13) not null unique key,
dept_id int,
foreign key (dept_id) references department(id)
);
위와 같이 부모,자식 관계가 형성된 것을 알 수 있다.
제약조건이란 데이터의 무결성을 지키기 위한 제한된 조건을 의미한다.
특정 데이터를 입력할 때 무조건적으로 입력되는 것이 아닌, 어떤 조건을 만족했을 때에 입력되도록 제약할 수 있다.
MySQL은 데이터의 무결성을 위해서 다음의 5가지 제약조건을 제공한다.
기본 키에 입력되는 값은 중복될 수 없으며, NULL값이 입력될 수 없다.
ex) 인터넷 쇼핑몰에서는 회원 테이블의 기본 키를 회원 아이디로 설정했을 것이다. 아이디가 중복되거나 아이디 없이 회원가입을 할 수 있는경우는 없기 때문이다.
기본키는 1개만 갖는다.
CREATE TABLE (테이블명) (
칼럼명 자료형 제약조건 PRIMARY KEY,
);
위와 같이 KEY가 설정된 것을 알 수 있다.
또는 PRIMARY KEY를 맨 뒤에 작성하여 PK를 설정하는 방법도 있다.
CREATE TABLE member
( mem_id CHAR(8) NOT NULL,
mem_name VARCHAR(10) NOT NULL,
height TINYINT UNSIGNED NULL,
PRIMARY KEY (mem_id)
);
DESCRIBE member;
PK의 이름을 바꾸고 싶다면 아래와 같이 입력하면 된다.
CREATE TABLE userTBL(
userID CHAR(8) NOT NULL,
name VARCHAR(10) NOT NULL,
birthYear INT NOT NULL,
CONSTRAINT PRIMARY KEY '변경될 PK' (userID)
);
위와 같은 결과가 나타내어 진다.
MYSQL은 Primary Key로 지정하면 항상 키 이름을 'PRIMARY'로 보여준다.
하지만 Foreign Key는 하나의 테이블에 여러개가 생성될 수 있으므로 이름을 지정해서 관리하는 것이 편하다.
테이블의 지정된 키를 보는 쿼리문은 아래와 같다.
SHOW KEYS FROM 테이블명;
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
ADD CONSTRAINT PK userTBL userID
PRIMARY KEY(userID);
해석해보자.
ALTER TABLE usertbl
usertbl을 변경하자
ADD CONSTRAINT PK_usertbl_userID
제약 조건을 추가하자. 추가할 제약조건의 이름은 'PK_usertbl_userID'이다.
PRIMARY KEY(userID)
추가할 제약 조건은 기본 키 제약조건이다. 그리고 제약 조건을 설정할 열은 userID열이다.
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)
);
중요한 쿼리는
FOREIGN KEY(userID) REFERENCES userTBL(userID)
외래 테이블 buyTBL의 열에서 참조하는 기준 테이블(userTBLE)의 열(userID)는 기본 키로 설정되어 있는 것이 확인된다.
만약 기준 테이블이 Primary Key 또는 Unique가 아니라면 외래 키 관계는 성립되지 않는다.
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);
ALTER TABLE buytbl
buytbl을 수정한다
ADD CONSTRAINT FK_usertbl_buytbl
제약 조건을 더한다. 제약 조건 이름은 'FK_usertbl_buytbl'로 명명한다.
FOREIGN KEY (userID)
외래 키 제약 조건을 buytbl의 userID에 설정한다.
REFERENCES usertbl(userID)
참조할 기준 테이블은 usertbl 테이블의 userID열 이다.
아래와 같은 테이블이 있다고 하자.
DROP TABLE IF EXISTS buy, member;
CREATE TABLE member
(mem_id CHAR(8) NOT NULL PRIMARY KEY,
mem_name VARCHAR(10) NOT NULL,
height TINYINT UNSIGNED NULL
);
CREATE TABLE buy(
num INT AUTO_INCREMENT NOT NULL PRIMARY KEY,
mem_id CHAR(8) NOT NULL,
prod_name CHAR(6) NOT NULL,
FOREIGN KEY(mem_id) REFERENCES member(mem_id)
);
member테이블에서 mem_id를 바꿀 경우 어떻게 될까?
실행해보자.
UPDATE member SET mem_id = 'PINK' WHERE mem_id = 'BLK';
위의 쿼리문을 실행 시키면 다음과 같은 오류가 발생한다.
PK,FK 관계가 설정되어 있어 임의로 수정 및 삭제할 수 없다는 내용이다.
마찬가지로 아래와 같이 mem_id = 'BLK' 인 정보를 지우는 쿼리문을 작성하고 실행시켜보자.
DELETE FROM member WHERE mem_id = 'BLK';
마찬가지로 아래와 같이 오류가 뜬다.
위와 같은 무결성을 해결하기 위한 방법으로, 아래와 같은 기능을 추가해서 실행 시킬 수 있다.
DROP TABLE IF EXISTS buy;
CREATE TABLE buy
( num INT AUTO_INCREMENT NOT NULL PRIMARY KEY,
mem_id CHAR(8) NOT NULL,
prod_name CHAR(6) NOT NULL
);
ALTER TABLE buy
ADD CONSTRAINT
FOREIGN KEY(mem_id) REFERENCES member(mem_id)
ON UPDATE CASCADE
ON DELETE CASCADE;
위의 sql쿼리를 실행 한 후,
UPDATE member SET mem_id = 'PINK' WHERE mem_id = 'BLK';
를 실행시키면
위와 같이 업데이트가 오류없이 잘 실행이 된다.
NULL
값을 허용 한다.DROP TABLE IF EXISTS buy, member;
CREATE TABLE member
(mem_id CHAR(8) NOT NULL PRIMARY KEY,
mem_name VARCHAR(10) NOT NULL,
height TINYINT UNSIGNED NULL,
email CHAR(30) NULL UNIQUE
);
위와 같은 테이블을 만든 후, 데이터를 넣어보자.
INSERT INTO member VALUES('BLK', '블랭핑크', 163,'pink@gmail.com');
INSERT INTO member VALUES('TWC' '트와이스', 167, NULL);
INSERT INTO member VALUES('APN', '에이핑크', 164,'pink@gmail.com');
실행 시킨다면 아래와 같은 오류가 뜬다.
DROP TABLE IF EXISTS member;
CREATE TABLE member
(mem_id CHAR(8) NOT NULL PRIMARY KEY,
mem_name VARCHAR(10) NOT NULL,
height TINYINT unsigned NULL CHECK(height >= 100),
phone1 CHAR(3) NULL
);
INSERT INTO member VALUES('BLK', '블랭핑크', 163, NULL);
INSERT INTO member VALUES('TWC', '트와이스', 99, NULL);
위의 쿼리문을 실행 시키면 아래와 같은 오류가 발생한다.
CHECK조건을 걸었기 때문이다.
ALTER TABLE member
ADD CONSTRAINT
CHECK (phone1 IN('02', '031', '032', '054', '055', '061'));
위와 같은 제약조건을 설정 한 후, 아래 쿼리문을 실행시키면
INSERT INTO member VALUES('TWC', '트와이스', 176 , '02');
INSERT INTO member VALUES('OMY', '오마이보이', 167 , '010');
위와 같은 오류가 발생한다.
DROP TABLE IF exists member;
CREATE TABLE member
( mem_id CHAR(8) NOT NULL PRIMARY KEY,
mem_name VARCHAR(10) NOT NULL,
height TINYINT UNSIGNED NULL DEFAULT 160,
phone1 CHAR(3) NULL
);
ALTER TABLE member
ALTER COLUMN phone1 SET DEFAULT '02';
INSERT INTO member VALUES('RED' , '레드벨벳', 161, '054');
INSERT INTO member VALUES('SPC', '우주소녀', default, default);
외래키는 NULL 값이 올 수 없으며, 참조 릴레이션(테이블)의 기본키와 같아야 하는 제약조건으로 테이블 참조 시 오류가 없도록 하기 위한 제약조건이다.
아래 [교수] 테이블의 '학과번호' 에서 참조하는 [학과]티이블의 '학과번호'의 값은 반드시 존재해야 한다.
즉, 참조 무결성은 외래키가 기본키와 같아야 한다는 것을 의미한다.
참고 영상 및 글