이제서야 이걸 정리하네요.
ALTER TABLE 명령어
alter table 명령어는 모르시는 분이 없듯이 테이블의 스키마를 변경 할 수 있게 끔 해주는 아주 유용한 명령어입니다.
alter table 명령어가 없으면 아주 끔찍한 일이 벌어질 수도 있습니다. create table…과 drop table의 남발!! 정말 끔찍하지 않습니까?
그런데 테이블의 스키마? = 테이블의 구조
관계형 데이타베이스를 이용할려면 이놈들을 속성(attribute)들로 뭉쳐진 의미있는 정보의 단위로 이끌어 내야 하는데 이러한 것을 엔티티(Entity)라고 합니다.
정확히 말하면 이 엔티티의 구조를 설명한 게 스키마입니다!
이 스키마는 논리적 스키마와 물리적 스키마로 분리해서 부르는데 특정회사의 데이타베이스에 맞게 스키마를 표현하게 되면 물리적 스키마라고 부릅니다.
엔티티가 물리적 스키마에 의해서 실제 데이타베이스에 적용된 것이 테이블입니다.
더 자세한 사항은 시중에 나와 있는 데이타베이스 설계 관련 서적을 참고하세요! 없는 실력으로 더 자세한 설명은 도저히 무리입니다.^^
alter table 명령어는 각 회사의 데이타베이스에 따라서 약간씩 차이가 있습니다.
여기서는 제가 맨날 까먹는 alter table 명령어 중 MySQL 용 몇개를 오로지 안까먹기 위해서 적어둘려고 합니다. 사실 팁은 아닙니다.^^
일단 alter table 명령어를 쓰기 위해서 간단한 테이블을 하나 만들겠습니다.
테이블 이름은 mytable이고 컬럼은 id와 name만 가지고 있는 아주 간단한 예제용 테이블입니다.
mysql>CRAETE TABLE mytable ( ->id varchar(12) not null, ->name varchar(20) not null ->);
아주 simple 하고 좋은데 id와 name외에 주소를 뜻하는 addr 컬럼을 추가해 봐야 하겠습니다.
[테이블에 새로운 컬럼 추가하기]
형식) alter table [테이블명] add column [추가할 컬럼명] [추가할 컬럼 데이타형]
mysql>ALTER TABLE mytable ADD COLUMN column addr VARCHAR(70) NOT NULL DEFAULT '';
뒤에 not null 을 안 붙이면 null 허용으로 컬럼이 추가됩니다.
위의 명령어에 의해서 addr 이라는 컬럼이 mytable에 추가 되었습니다.
그런데 주소를 뜻하는 addr 컬럼의 자릿수가 웬지 부족해 보입니다. varchar(100)으로 늘려봐야 겠습니다.
[테이블의 컬럼 타입 변경하기]
형식) alter table [테이블명] modify column [변경할 컬럼명] [변경할 컬럼 타입]
mysql>ALTER TABLE mytable MODIFY COLUMN addr VARCHAR(100) NOT NULL DEFAULT '';
desc mytable로 확인해 보면 addr 컬럼이 varchar(100)으로 정확하게 변경되었습니다.
주소 컬럼에는 맞지 않겠지만 addr 컬럼을 int 형에 null 허용으로 변경해 보고 싶습니다.
mysql>ALTER TABLE mytable MODIFY COLUMN addr INT;
DESC mytable 로 확인 해보니 int 형에 null 허용으로 변경되었습니다. 주소가 int 형이라니 말이 안됩니다.
int 형이라면 아무래도 나이가 맞을 것 같습니다. addr의 컬럼명 자체를 age 로 바꿔야 겠습니다.
[테이블의 컬럼 이름 변경하기]
형식) alter table [테이블명] change column [기존 컬럼명] [변경할 컬럼명] [변경할 컬럼 타입]
mysql>ALTER TABLE mytable CHANGE COLUMN addr age INT NOT NULL;
addr 컬럼명이 age 라는 컬럼명으로 정확히 바뀌었습니다. 그치만 애초에 age 컬럼은 필요가 없었습니다. 테이블에서 age 컬럼을 삭제 해야 하겠습니다.
[테이블 컬럼 삭제하기]
형식) alter table [테이블명] drop column [삭제할 컬럼명]
mysql>ALTER TABLE mytable DROP COLUMN age;
desc mytable로 확인해보니 age 컬럼이 삭제되어져 있습니다.
뭔가 허전합니다. id 컬럼에 인덱스(Index)를 주면 허전함이 달래질 것 같습니다.
[테이블 컬럼에 인덱스 주기]
형식) alter table [테이블명] add index 인덱스명( 인덱스를 줄 컬럼1, 인덱스를 줄 컬럼2,…)
mysql>ALTER TABLE mytable ADD INDEX myindex(id);
위에서는 myindex 라는 인덱스명으로 id 컬럼에 index 가 추가되었습니다.
인덱스를 줄 컬럼을 한개 이상 써 넣으면 복수개의 컬럼에 대해서도 인덱스를 생성할 수 있습니다. 이번에는 id에 주어진 index 를 삭제해 보겠습니다.
[테이블 컬럼에 인덱스 삭제하기]
형식 ) alter table [테이블명] drop index 인덱스명
mysql>ALTER TABLE mytable DROP INDEX myindex;
위에서는 처음에 줬던 index 인 myindex 를 삭제하고 있습니다.
참고로 인덱스를 확인하기 위해서는 아래의 명령어를 쓰시면 됩니다. mytable은 테이블 명입니다.
mysql> SHOW INDEX FROM mytable;
alter table로 인덱스도 추가하고, 날려봤는데 primary key 는 못 만들까요? 당연히 만들수 있습니다.
그대신 primary key 는 조건이 있습니다.
primary key를 만들려는 컬럼에 조건이겠지요!!!
레코드에 값이 추가 안 되어있을 때는 괜찮지만, 값이 들어있다면 column 에 null 값이 들어 있는지, 중복된 값이 존재하는 column 인지를 따져봐야 합니다.
null 값이 없고, 중복되는 column 이 없다면 primary key를 만들 수 있습니다.
[테이블에 primay key 만들기]
형식 ) alter table [테이블명] add primary key ( 키를 줄 column명1, 키를 줄 column명2, … );
mysql> ALTER TABLE mytable ADD PRIMARY KEY (id);
위에서는 mytable의 id 컬럼에 primary key 를 만들고 있습니다.
primary key 는 composite key 가 가능하므로 여러개의 column을 묶어서 primary key 로 사용할 수도 있습니다.
만들어진 primary key를 지워야 할 때도 있습니다.
[테이블에 primay key 삭제하기]
형식) alter table [테이블명] drop primary key;
mysql> ALTER TABLE mytable DROP PRIMARY KEY;
위에서는 mytable에 만들었던 primary key를 삭제하고 있습니다.
참고로 primary를 만들때는 index가 자동으로 primary key 컬럼에 추가됩니다.
primary key도 다시 날려버리고 아주 좋습니다. 마지막으로 테이블명을 변경해 보고 싶습니다.
사실 mytable이라는 테이블명이 아주 마음에 안 들었습니다.
column 속성이 auto increment 이라면 변경(삭제)이 안될 수 있어요. primary key 속성을 삭제하기 전에 auto increment 속성은 제거하면 됩니다.
[테이블 명 바꾸기]
형식) alter table [원본 테이블명] rename [새로운 테이블명];
mysql> ALTER TABLE mytable RENAME utable;
alter table에 대해서 대충 알아 봤습니다.
그 유명한 다른 primary key를 뽀려온 foreign key 에 대한 부분도 정리 했으면 좋겠는데.. 오늘은 제 시간 관계 상 여기서 정리를 끝내겠습니다.