데이터 정의 언어 - ( DDL : Data Definition Language )
- 테이블 구조를 생성하는데 사용하며 CREATE, ALTER, DROP, TRUNCATE 문 등이 있다.
CREATE - 새로운 데이터베이스 테이블 생성
DROP - 이미 존재하는 데이터베이스 테이블을 삭제
ALTER - 이미 존재하는 데이터베이스 구조를 변경
COMMENT - 데이터베이스에 주석을 추가
RENAME - 테이블의 이름을 변경
TRUNCATE - 테이블에서 데이터를 제거한다.
DDL 언어는 Auto Commit(?) 이 작동한다. ( 추후 궁금증 )
( ※주의 : 1번 소멸 후 Auto Commit 이 되므로 되돌릴 수 없다. )
간단한 정의를 배웠으므로, DDL 의 CREATE 를 사용하여
(기본 걷기 문제 1) 의 테이블을 제작해보려고 합니다.
CREATE TABLE `sparta`.`sparta_employees` (
`id` INT NOT NULL ,
`name` VARCHAR(100) NOT NULL ,
`position` VARCHAR(100) NOT NULL ,
`salary` INT NOT NULL ,
`hire_date` DATE NOT NULL ,
PRIMARY KEY (`id`)
)
해당 SQL 문으로 생성은 되긴 하지만, 추가적으로 붙여도 되는 것들을 정리하겠습니다.
'id' INT NOT NULL AUTO_INCREMENT,
AUTO_INCREMENT (Click) 이란
AUTO_INCREMENT는 MySQL에서 숫자형 기본 키(Primary Key) 값을 자동으로 증가시키는 기능입니다.
보통 기본 키(Primary Key) 로 사용되는id컬럼에 적용하여, 데이터가 삽입될 때마다 자동으로 1씩 증가하는 고유한 값을 생성할 수 있습니다.
만약 웹 개발 사이트에 쓰인다면... 게시글 번호 정도로 쓰일 것 같습니다.
RENAME TABLE `sparta`.`sparta_employees` TO `sparta`.`employees`;
테이블 자체의 이름을 변경하기 위해 사용 됩니다.
[데이터베이스].[테이블] TO [데이터베이스].[바뀔 테이블명]
중요한 ALTER 사용법 입니다.
MySQL ALTER 공식 문서
ALTER TABLE operations that use the COPY algorithm wait for other operations that are modifying the table to complete. After alterations are applied to the table copy, data is copied over, the original table is deleted, and the table copy is renamed to the name of the original table. While the ALTER TABLE operation executes, the original table is readable by other sessions (with the exception noted shortly). Updates and writes to the table started after the ALTER TABLE operation begins are stalled until the new table is ready, then are automatically redirected to the new table. The temporary copy of the table is created in the database directory of the original table unless it is a RENAME TO operation that moves the table to a database that resides in a different directory.
다른 작업이 끝날 때까지 대기:
- ALTER TABLE이 실행되면, 현재 테이블을 수정 중인 다른 작업이 끝날 때까지 기다린다.
임시 테이블을 만들어 변경 적용:
- 원본 테이블을 복사해서 임시 테이블을 만든다. 이 임시 테이블에 변경 사항을 적용한다.
데이터 복사 후 원본 교체:
- 원본 테이블의 데이터를 새로 만든 테이블로 복사한다.
- 복사가 끝나면 원본 테이블을 삭제하고, 임시 테이블의 이름을 원본 테이블 이름으로 변경한다.
- 읽기는 가능하지만, 쓰기는 잠시 멈춘다:
ALTER TABLE이 실행되는 동안, 다른 세션(사용자)들은 읽기(SELECT) 작업은 할 수 있다.
하지만, INSERT, UPDATE, DELETE 같은 쓰기 작업은 잠시 멈췄다가 새로운 테이블이 준비되면 자동으로 적용된다.
임시 테이블 저장 위치:
기본적으로 원본 테이블이 있는 같은 디렉터리(데이터베이스 폴더)에 임시 테이블이 만들어진다.
단, RENAME TO를 사용해 다른 데이터베이스(다른 디렉터리에 있음)로 이동하면 예외가 발생할 수 있다.
ALTER TABLE `employess` CHANGE `salary` `salary` DOUBLE NOT NULL;
데이터 베이스의 구조를 변경합니다.
DROP TABLE `employess`
테이블을 삭제 합니다.
오늘 새롭게 안 사실
MySQL 공식 문서에 따르면 ALTER 할때 테이블의 원본을 복사하고 붙여넣기 하는 과정이
자바의 비동기 작업하기 위해쓰는 작업과 비슷하다는 걸 알았다.
예를 들어 자바의 List 컬렉션을 비동기 작업에서 진행되는 도중 다른 곳에서 데이터의 간섭이 일어나면 동시성 문제에 직면하게 된다 (CompletableFuture)
이 처럼 테이블을 바로바로 바꾸지않고 하나를 복사하고 데이터를 안전하게 처리한 뒤 원본은 교체한다.
그리고 컴럼의 형은 숫자가 우선 변경된다는 점.