< REGION 추가 예제 >
region
의provinces
테이블을 수정하여 마지막 자리에suffix_index
열 추가. (DROP 금지)region
의provinces
테이블의 모든 레코드에 대한suffix_index
값을 알맞게 수정. ( 가령,대구
라는 이름을 가진 레코드의suffix_index
는광역시
라는suffix
를 가지는 레코드의index
값이 된다.region
의provinces
테이블을 수정하여suffix_index
열에는region
.suffix_index
테이블의index
열에 존재하는 값만 들어가게 할 것.
- 테이블 수정시 제약조건 추가는 아래와 같이 한다.
ALTER TABLE `스키마`.`테이블` ADD CONSTRANINT `제약 조건 이름` <제약 조건>.... 가령, `simple` 열에 UNIQUE 키를 추가하려면 아래와 같이 작성 ALTER TABLE `s`.`t` ADD CONSTRAINT`uk-1` UNIQUE (`simple`);
CREATE TABLE `region`.`suffixes`
(
`index` TINYINT UNSIGNED NOT NULL AUTO_INCREMENT,
`suffix` VARCHAR(5) NOT NULL,
CONSTRAINT PRIMARY KEY (`index`),
CONSTRAINT UNIQUE (`suffix`)
);
INSERT INTO `region`.`suffixes` (`suffix`)
VALUES ('특별시'),
('광역시'),
('특별자치시'),
('도'),
('특별자치도');
ALTER TABLE `region`.`provinces`
ADD COLUMN `suffix_index` TINYINT UNSIGNED NOT NULL;
UPDATE `region`.`provinces`
SET `suffix_index` = 1
WHERE `provinces`.`name` IN ('서울');
UPDATE `region`.`provinces`
SET `suffix_index` = 2
WHERE `provinces`.`name` IN ('인천', '대전', '부산', '울산', '대구', '광주');
UPDATE `region`.`provinces`
SET `suffix_index` = 3
WHERE `provinces`.`name` IN ('세종');
UPDATE `region`.`provinces`
SET `suffix_index` = 4
WHERE `provinces`.`name` IN ('경기', '강원', '충청남', '충청북', '경상북', '경상남', '전라남', '전라북');
UPDATE `region`.`provinces`
SET `provinces`.`suffix_index` = 5
WHERE `name` IN ('제주');
region
.provinces
테이블에 SET뒤에는 컬럼의 이름을 적고 = 을 통해 추가 할 값을 적어주면 된다.IN 이란..
업데이트 범위를 정할 때 다른 테이블을 참조해야 할 경우 IN을 사용하여 데이터를 포함시키거나 NOT IN을 사용하여 제외시킬 수 있다.
IN의 서브 쿼리에서 키값이 여러 개인 경우 컬럼을 묶어서 조건을 맵핑할 수 있다.
즉, 서울이라는 이름을 가진 열에 suffix_index 1을 추가하겠다는 의미가 된다!
정리를 해보자면!
↓ provinces 테이블
UPDATE `region`.`provinces`
↑ region스키마
↓ 어떤 열에 추가를 할 것인지
SET `suffix_index` = 1
↑ 추가할 값
↓ 조건, provinces테이블의 name에
WHERE `provinces`.`name` IN ('서울');
↑ '서울'이라는 이름을 가진 열에게 추가.
suffix_index
가 UPDATE문을 통해 정보 추가가 된것을 확인 해볼 수 있다.ALTER TABLE `region`.`provinces`
ADD CONSTRAINT `fk_suffix_index` FOREIGN KEY (`suffix_index`) REFERENCES `region`.`suffixes` (`index`);
SELECT `province`.`code` AS `국번`,
CONCAT(`province`.`name`, `suffix`.`suffix`) AS `이름`
FROM `region`.`provinces` AS `province`
LEFT JOIN `region`.`suffixes` AS `suffix` ON `province`.`suffix_index` = `suffix`.`index`
ORDER BY `province`.`code`;
- SELECT 해서 나온 결과
< SCHOOL예제 >
CREATE SCHEMA `school`;
CREATE TABLE `school`.`grades`
(
`grade` TINYINT(1) UNSIGNED NOT NULL,
CONSTRAINT PRIMARY KEY (`grade`)
);
CREATE TABLE `school`.`classes`
(
`grade` TINYINT(1) UNSIGNED NOT NULL,
`class` TINYINT(2) UNSIGNED NOT NULL,
CONSTRAINT PRIMARY KEY (`grade`, `class`),
CONSTRAINT FOREIGN KEY (`grade`) REFERENCES `school`.`grades` (`grade`)
);
CREATE TABLE `school`.`genders`
(
`code` VARCHAR(1) NOT NULL,
`text` VARCHAR(5) NOT NULL,
CONSTRAINT PRIMARY KEY (`code`)
);
CREATE TABLE `school`.`students`
(
`grade` TINYINT(1) UNSIGNED NOT NULL,
`class` TINYINT(2) UNSIGNED NOT NULL,
`number` TINYINT(2) UNSIGNED NOT NULL,
`name` VARCHAR(10) NOT NULL,
`gender_code` VARCHAR(1) NOT NULL,
`contact` VARCHAR(11) NOT NULL COMMENT '본인 연락처', -- COMMENT 열에 대한 설명
`contact_parent` VARCHAR(11) NOT NULL COMMENT '부모 연락처',
`dropped_flag` BOOLEAN NOT NULL DEFAULT FALSE COMMENT '(우리 학교로부터) 자퇴 여부',
`expelled_flag` BOOLEAN NOT NULL DEFAULT FALSE COMMENT '(우리 학교로부터) 제적 여부',
`transferred_flag` BOOLEAN NOT NULL DEFAULT FALSE COMMENT '(우리 학교로의) 전학 여부',
`admitted_flag` DATE NOT NULL COMMENT '입학 일자',
`transferred_at` DATE DEFAULT NULL COMMENT '전학 일자',
CONSTRAINT PRIMARY KEY (`grade`, `class`, `number`),
CONSTRAINT FOREIGN KEY (`grade`, `class`) REFERENCES `school`.`classes` (`grade`, `class`),
CONSTRAINT FOREIGN KEY (`gender_code`) REFERENCES `school`.`genders` (`code`)
);
FOREIGN KEY
를 ( grade, class )
이렇게 걸어주는 이유는-> 현재 Diagrams
- 학생 열 추가 완료.