지금까지는 기존 존재하던 BaseBallData에 쿼리를 실행하였다면, 이번에는 우리가 직접 데이터베이스를 작성하는 시간을 가져보자.
이번 시간은 문법만 주구장창 늘어놓는 느낌이라 다소 지루할 수도 있겠다.
명색이 MMORPG 게임 개발 시리즈이니, 게임과 관련된 데이터베이스를 작성해보자.(스키마라고도 한다.)
아주 간단하게 이와 같이 작성하면 된다.
CREATE DATABASE GameDB;
해당 쿼리를 실행하고, 새로고침을 하면 GameDB라는 데이터베이스가 생성될 것이다.
이 데이터베이스를 사용할 것이니, USE GameDB를 입력하고, 테이블 역시 제작해보자
게임하면 아무래도 시작하기 전에 회원가입을 하라고 닥달할테니, 계정에 대한 테이블을 생성하자.
--CREATE TABLE 테이블명(열의 이름 자료형 [DEFAULT 기본값] [NULL|NOT NULL]...)
CREATE TABLE accounts(
accountId INTEGER NOT NULL,
accountName VARCHAR(10) NOT NULL,
coins INTEGER DEFAULT 0,
createdTime DATETIME
);
C#으로 비유하자면, 그저
int accountid;
string accountName;
과 같이 자료형을 선언하는 것과 다를 바가 없다. 그저 INTEGER와 같이 자료형 뒤에 NULL인지, Default 값은 무엇인지, 어떤게 Primary Key인지(후에 설명) 부가 설명이 붙을 뿐이다.
SELECT * FROM accounts;로 조회해보면, 우리가 작성한 의도대로 정상적으로 열이 생성됨을 알 수 있을 것이다.
DROP은 테이블을 삭제시 사용하는 명령어다.
DROP TABLE accounts;
다만 테이블을 삭제시키는 만큼, 통짜로 날아가므로 이에 유의하자.
테이블 추가, 삭제 뿐만 아니라 테이블에 대해 변경을 할 수도 있다.
즉, 열을 추가(ADD)하거나 삭제(DROP)하거나 변경(ALTER)할 수 있다.
누군가는 '애초에 추가할 때, 모든 정보를 넣으면 되지 않는가?' 의문을 가질 텐데,
당장 우리가 즐기는 게임에서 신규 업데이트로 지역이나 아이템이 추가되는 사례가 빈번하니, 게임 초창기 버전부터 모든 정보를 포함하기란 쉽지 않기에, ALTER가 쓰이는 것이다.
생각해보니 accounts 테이블 내 마지막 접속 시간을 넣으면 좋을 것 같으니, 예제를 통해 추가해보자.
--테이블 accounts를 변경하되, DATETIME 자료형 열을 추가하자.
ALTER TABLE accounts
ADD lastEnterTime DATETIME;
다시 삭제(DROP)하고 싶다면 다음 쿼리를 실행하자.
--테이블 accounts를 변경하되, lastEnterTime 열(COLUMN)을 삭제(DROP)하자.
ALTER TABLE accounts
DROP COLUMN lastEnterTime;
이번엔 account 테이블 내 accountName의 자료형 크기가 너무 작으니 좀 늘려보고, NULL이 아니여야 하는 조건을 추가해보자.
ALTER TABLE accounts
ALTER COLUMN accountName VARCHAR(20) NOT NULL;
NOT NULL등의 추가 사항을 제약(CONSTRAINT)라고 하며, 이를 ALTER를 통해 추가/삭제를 할 수 있다.
대표적인 예시로
NOT NULL/NULL
UNIQUE
PRIMARY KEY
FOREIGN KEY
여기서 PRIMARY KEY는 매우 중요(예전에도 다루어 본 것같지만, 한번 더 복습하자)하니 별표 다섯개에 밑줄까지 쫙 치자. 잠깐 Baseball 데이터베이스에서 Player 테이블의 디자인을 살펴보자.
이와 같이 lahmanID 열에 자그마한 열쇠 모양이 달려있다. C#으로 비유하면 Dictionary 구조라고 할 수 있다. Dictionary<int,string>의 예시로, 앞 자료형 int가 Key이며, 덕분에 string을 고유하게 구분할 수 있다.
데이터베이스 역시 Primary Key가 이와 같은 역할을 한다. 무지막지하게 많은 데이터가 있을 때, 빠르게 찾기 위한 용도라는 점이다.
해당 특성에 더불어 Primary Key는 유일성을 보장해야 한다. (즉, 우리 주민등록번호처럼, 나 하나를 특정 지을 수 있어야 한다.) 다르게 말하면, GameDB에서 coin 등의 열은 Primary Key로 선정하기에 매우 부적절할 것이다.(중복될 수 있기 때문에)
혹은 두 개이상의 열을 Primary Key로도 지정할 수 있다.(Composite Key라고 한다.)
물론 해당 SQL 프로그램에서 디자인으로 넘어가 키로 지정할 수도 있지만, sql문을 이용해보자.
ALTER TABLE accounts
ADD PRIMARY KEY(accountId);
그러나 해당 쿼리는 한계점이 있는데, 만에 하나 다시 Primary Key를 취소하고 싶다하면 해당 Primary Key의 이름이 정해져 있지 않아 다소 난감하다. 따라서 다음 쿼리로 이름을 지정하고, DROP로 이름을 정해 이를 삭제하는 것이 권장된다.
ALTER TABLE accounts
ADD CONSTRAINT PK_Account PRIMARY KEY(accountID);