14. [SQL기초] DDL(Data Definition Language)로 테이블 스키마 생성/수정/삭제하기

지금까지 데이터를 관리하는 방법에 대해 배웠다면 지금부터는 데이터를 담는 그릇, 그러니까 테이블을 정의하는 방법을 배우게 됩니다. 테이블을 생성하고, 수정하고, 삭제하는 과정도 모두 쿼리문을 사용합니다. 이렇게 테이블을 정의하는 용도로 사용하는 쿼리문을 따로 구분해서 데이터 정의 언어(Data Definition Language), 또는 DDL이라고 합니다.

DDL은 정해진 쿼리문 문법이 정해져 있고, 정해진 틀에 맞춰서 사용하면 되기 때문에 배우는 수고를 크게 하지 않아도 됩니다. 반대로 테이블을 세심하게 만들지 않으면 나중에 데이터를 관리하기가 어려워지는 문제가 생기게 되므로, 테이블을 만들 때는 몇 가지 중요한 기초 개념들에 대해서 확실히 숙지를 해 두어야 합니다.

하나씩 배우겠지만 기본키와 외래 키, 기본값, 그리고 널 허용은 테이블을 정의할 때 아주 중요한 요소이고 테이블 정의에 사용할 때 주의를 해야 합니다. 처음 잘못 만든 테이블에 이미 데이터가 저장되고 나면 쿼리문을 작성할 때마다 여러 가지 쿼리 조건을 추가해야 합니다.


스키마 생성과 삭제

스키마는 데이터베이스를 말합니다. 데이터베이스에 따라서 조금 다른 개념을 사용하기도 하지만, 스키마를 구조를 만든다고 하면 데이터베이스를 만들고 그 안에 스키마 객체들 그러니까 테이블을 만드는 과정을 말합니다.

Create database 데이터베이스명;

테이블은 스키마를 만들고 그 안에 테이블을 만들어 스키마 구조를 생성합니다. 스키마 안에서 테이블 이름은 유일해야 합니다. 스키마가 다르면 테이블 이름이 중복되어도 괜찮습니다.

스키마가 서로 다른 테이블에 접근할 때는 “스키마명.테이블 이름”으로 접근할 수 있습니다. 데이터베이스에 따라서는 “스키마명.객체사용자.테이블 이름”과 같이 객체 사용자를 명시해야 할 수도 있습니다.

스키마를 만든 후에는 스키마 안에 넣을 여러가지 객체들을 추가합니다. 테이블, 스토어드 프로시저, 인덱스, 뷰 등의 객체를 추가해서 스키마를 채우면 비로소 데이터베이스의 기능을 제대로 하게 됩니다.

스키마 삭제는 DROP문을 사용합니다.

Drop database 데이터베이스명;


객체 이름을 정하는 방법

객체에 이름을 붙일 때는 제약사항을 준수해야 합니다. 제약사항을 준수하지 않는 객체는 생성할 수 없습니다. 객체 이름을 정하는 제약사항은 다음과 같습니다.

숫자로 시작할 수 없습니다. 반드시 문자로 시작해야 합니다.

내장 객체, 쿼리문 키워드, 예약어는 사용할 수 없습니다.

한글을 사용할 때는 큰따옴표로 이름을 감싸야합니다. (MySQL은 역 따옴표)

언더바(_) 외에 다른 특수문자, 기호는 사용할 수 없습니다.

데이터베이스에서 허용하는 최대 이름 길이를 초과하면 안 됩니다. (MySQL은 이름에 64자, 별칭에 256자로 제한)

제약 사항을 준수하는 이름이면 어떤 것 이어도 가능합니다.

단 객체 이름을 “xqw123” 과 같이 정해서 사용해서는 안됩니다. 만들 당시에는 어떤 용도로 사용하기 위한 것인지 기억하겠지만, 시간이 지나면 자신도 무슨 용도의 객체인지 알 수 없게 됩니다. 객체 이름을 정할 때는 다음 몇 가지 규칙을 따라 정해서 사용하는 것이 좋습니다.

한글보다는 영문명을 사용합니다. 한글 이름을 사용하면 큰따옴표(MySQL은 역 따옴표)를 붙여야 하기 때문에 이름 입력 길이가 길어집니다.

일상적으로 잘 알려진 단어를 사용해서 이름을 정합니다.

2 단어 이상으로 조합할 때는 언더바(_)로 단어를 조합해서 사용합니다.

용도를 알 수 있는 접두어를 붙입니다. 스토어드 프로시저는 “sp_”와 같은 접두어를 붙이고, 뷰는 “vw_” 같은 짧은 접두어를 붙여서 관리하면 객체 관리가 훨씬 쉬워집니다.

가능하면 짧은 이름을 사용합니다. “vendor_submall_order”같이 긴 이름보다는 “vs_order”와 같이 짧은 이름을 사용하는 것이 좋습니다.


DDL 기본 구조

객체를 정의하는 문법은 딱 3개만 있습니다. 객체를 생성할 때는 “CREATE”, 객체를 수정할 때는 “ALTER”, 객체를 삭제할 때는 “DROP”문을 사용합니다.

데이터베이스를 생성할 때는 “CREATE DATABASE”문으로 생성하고, 데이터베이스를 삭제할 때는 “DROP DATABASE”문으로 삭제합니다. 명령어 뒤에 객체 대상을 표시해서 객체 추가, 수정, 삭제를 합니다. 테이블과 컬럼도 같은 명령어로 객체 관리를 합니다.


테이블 생성

대표적인 스키마 객체인 테이블을 만들어보겠습니다.

기본 구문

CREATE TABLE 테이블 이름 (

                 열이름1 데이터 형 속성,

                 열이름2 데이터 형 속성,

)

DDL 중 가장 많이 사용하고, 또 알아야 할 내용들도 가장 많습니다.

열 이름은 객체 이름 생성 규칙을 그대로 따라갑니다. 데이터 형은 데이터베이스에서 지원하는 데이터 형을 지정합니다. INTEGER, VARCHAR, DATETIME과 같은 데이터 형을 표시합니다. 데이터 형은 데이터베이스마다 지원하는 형식이 조금씩 다릅니다. 사용하는 데이터 형 이름도 다르므로 데이터베이스 종류에 따라 맞춰서 사용해야 합니다.

속성은 열의 여러 가지 속성을 표시합니다. 행 데이터 추가 시에 열이 누락되었으면 자동으로 입력하는 기본값을 정하거나, NULL을 허용할지 여부를 속성에서 정할 수 있습니다.

데이터베이스에 따라서는 테이블을 생성할 때 한번 정한 NULL 속성을 테이블 수정 기능으로는 변경할 수 없으므로 NULL 속성은 특히 주의해서 설정해야 합니다.

기본적인 데이터 형과 속성을 가진 간단한 테이블을 하나 만들어보겠습니다.

Create table example1 (
                 Id integer not null auto_increment,
                 Name varchar(30) not null,
                 Wt datetime default now()
);

테이블 이름은 “example1”로 합니다.

테이블 열(들)을 정의하는 부분은 괄호로 감싸서 영역을 구분합니다. 쿼리문 끝에는 세미콜론을 표시해서 쿼리문 끝임을 반드시 알려야 합니다.

“id”, “name”, “wt”는 열 이름입니다.

열과 열의 구분은 쉼표로 구분합니다. 테이블 생성 쿼리문을 여러 줄로 작성해서 이해하기 쉽게 했지만 다음처럼 그냥 한 줄로 작성해도 됩니다.

Create table example1 (Id integer not null auto_increment, Name varchar(30) not null, Wt datetime default now());

열 이름 뒤에 표시한 데이터 형은 뒤에서 따로 사용 가능한 데이터 형들에 대해서 자세히 설명합니다. 데이터 형 뒤에는 속성, 또는 제약 조건들이 오게 됩니다. 가장 많이 사용하는 속성이 NOT NULL과 DEFAULT입니다.

NOT NULL은 열에 NULL값을 허용하지 않는 것입니다. 행 추가를 할 때 열을 누락하거나 열에 NULL을 저장할 수 없습니다.

DEFAULT는 키워드 뒤에 공백을 띄워서 기본으로 저장할 값을 표시합니다. 행 추가를 할 때 열이 누락되면 이 값이 적용됩니다.

테이블 생성 쿼리문에 사용하는 속성과 제약 조건에 대해서는 뒤에서 자세히 설명합니다.

생성한 테이블 정의를 보려면 “DESC 테이블 이름;”으로 확인할 수 있습니다. 앞서 생성한 테이블을 “DESC example1;” 쿼리문으로 확인하면 다음과 같이 테이블 정의 명세를 확인할 수 있습니다.


속성과 제약조건의 사용

테이블을 생성할 때 열의 속성 부분에 표시하는 여러 가지 속성, 또는 제약 조건을 사용하면 데이터의 무결성을 유지하고, 저장되면 안 되는 데이터의 저장을 방지할 수 있습니다.

예를 들어 열 속성에 NOT NULL 속성을 지정하면 해당 열은 NULL을 저장하거나 기본 값이 NULL이 될 수 없습니다. NULL은 열의 특별한 상태를 가리키지만, 열에 저장되는 일반적인 데이터와는 다르게 특별하게 예외처리를 해야 하는 불편함이 따릅니다. 그래서 테이블을 만들 때는 대부분의 열에 NULL을 허용하지 않는 제한 속성을 추가합니다.

속성과 제약 조건은 한 개의 열에 여러 개를 공백으로 구분해서 표시할 수 있습니다. 다음의 열 속성 정의는 기본값은 빈 문자열 ‘’이고 널을 허용하지 않으며, 유니크 값(중복 없는 값)만을 허용합니다.

Name varchar(30) default ‘’ NOT NULL UNIQUE


기본키와 외래 키 속성

기본키는 테이블의 행을 고유하게 식별할 수 있도록 하는 식별자입니다. 기본키로 지정된 열에는 값에 중복이 없습니다. 기본키로 지정된 열은 별도 속성을 지정하지 않아도 UNIQUE 속성을 가지기 때문에 중복된 값을 저장할 수 없습니다.

기본키가 있는 테이블은 기본키 열을 WHERE절의 검색 조건으로 사용해 행 한 개를 정확하게 가져올 수 있습니다. 기본키가 없는 테이블은 중복 값이 없는 것을 보장할 수 없기 때문에, 가져오는 데이터가 원하는 행이라는 것을 보장할 수 없습니다.

테이블을 정의할 때 기본키는 다음과 같이 정의합니다. 예제 테이블 중에서 제조사(maker) 테이블을 생성하는 쿼리문입니다.

CREATE TABLE IF NOT EXISTS maker (
  ID bigint NOT NULL AUTO_INCREMENT,
  NAME varchar(20) NOT NULL,
PRIMARY KEY (ID)
);

기본키로 사용할 열은 “NOT NULL” 속성이 있어야 합니다. 그리고 PRIMARY KEY 키워드로 기본키로 사용할 열을 지정해야 합니다. 앞서의 예는 추가의 행에 기본키를 지정했지만, 다음과 같이 열 속성으로 지정할 수도 있습니다. 추가의 행에 기본키를 지정하는 이유는 뒤에서 설명합니다.

CREATE TABLE IF NOT EXISTS maker (
  ID bigint NOT NULL AUTO_INCREMENT PRIMARY KEY
);

기본키는 테이블 안에 1개만 있을 수 있지만 기본키가 컬럼 한 개를 의미하는 것은 아닙니다. 기본키는 여러 개의 컬럼으로 구성할 수 있습니다. 여러 개의 컬럼으로 구성된 기본키는 기본키에 포함된 열의 값이 모두 같아야 기본키가 중복된 것으로 처리됩니다. 기본키를 구성하는 컬럼의 값이 하나만 달라도 기본키는 다른 것이 됩니다.

여러 개의 컬럼을 하나의 기본키로 묶어서 다음과 같이 정의할 수 있습니다.

CREATE TABLE IF NOT EXISTS maker (
  ID bigint NOT NULL AUTO_INCREMENT,
  NAME varchar(20) NOT NULL,
PRIMARY KEY (ID, NAME)
);

두 개 이상의 컬럼을 묶어서 하나의 기본키를 생성할 때는 반드시 “PRIMARY KEY”문을 별도의 행에 구분해서 정의해야 합니다.

테이블의 기본키는 다음의 테이블 수정 DDL로 삭제할 수 있습니다.

alter table maker drop primary key;

SQL Server와 오라클은 기본키에 별도의 이름이 부여되어 있어야 기본키를 쉽게 삭제를 할 수 있습니다. 따라서 다음과 같이 별도의 이름을 부여해서 기본키를 만들어야 합니다. 기본키에 객체 이름을 부여하는 키워드는 “CONSTRAINT”입니다. 제약 조건 정도로 이해하면 됩니다.

CREATE TABLE IF NOT EXISTS maker (
  ID bigint NOT NULL,
  NAME varchar(20) NOT NULL,
Constraint pk_user PRIMARY KEY (ID, NAME)
);

“pk_user”라는 이름으로 maker 테이블의 기본키를 id와 name 열 2개로 만듭니다. 이 기본키를 삭제하려면 다음과 같이 테이블 수정 DDL을 작성하면 됩니다.

alter table maker drop constraint pk_user;

기본키 이름을 지정하지 않는다고 기본키에 이름이 없는 것은 아닙니다. 데이터베이스마다 고유의 방법으로 생성되는 객체에 이름을 자동으로 부여하기 때문에 삭제하려면 기본키의 이름이 무엇인지를 쿼리문으로 먼저 찾아야 하는 번거로움이 있기 때문에 알아보기 쉬운 이름으로 기본키 이름을 정하는 것입니다.

다른 테이블에서 이 기본키 값을 사용하는 열을 정의하면 이 컬럼을 외래 키라고 합니다. 외래 키는 기본키를 가진 테이블과 관계를 가지게 되고, 기본키를 가진 테이블에 의존적이 됩니다.

외래 키로 다른 테이블에서 참조를 하는 기본키 값은 임의로 삭제할 수 없습니다. 다른 테이블의 열에 값이 참조되면서 테이블의 관계가 이어져 있기 때문에 참조되고 있는 기본키 값을 삭제하면 데이터 무결성이 깨지게 됩니다.

외래 키는 한 테이블 안에 여러 개가 있을 수 있습니다. 외래 키를 통해 테이블들은 서로 연결되고 관계를 맺게 됩니다.

기본키와 외래 키는 관계형 데이터베이스의 뼈대를 이루는 중요한 속성입니다. 기본키와 외래키를 통해 테이블들은 서로 연결되고, 데이터의 무결성을 유지할 수 있게 됩니다.

데이터의 무결성 유지는 데이터베이스의 데이터 중복으로 인한 혼란을 막는 근간이기 때문에 기본키와 외래키는 테이블을 정의할 때 필수로 사용해야 합니다.


널 허용하기

열에 NULL을 허용하는 속성입니다. 널을 허용하지 않으려면 NOT NULL을 사용합니다. 열을 정의하는 기본 규칙은 NULL을 허용하는 것이기 때문에 널을 허용할 때는 별도로 NULL 표기를 하지 않습니다. NULL을 허용할 필요가 있는 열이 아니면 NOT NULL을 표기해서 널 입력을 막는 것이 좋습니다.

CREATE TABLE IF NOT EXISTS maker (
  ID bigint NOT NULL,
  NAME varchar(20)
);

Id 열에는 NULL을 저장할 수 없지만, name 열에는 NULL 저장할 수 있습니다. Name varchar(20)으로 정의한 컬럼은 name varchar(20) NULL과 같습니다.


기본값 속성

기본값은 테이블에 추가하는 행 데이터에 열이 누락되었을 경우 자동으로 입력되는 값입니다. 반드시 열의 데이터 형과 같은 형의 값으로 표시해야 합니다. 키워드는 “DEFAULT”를 사용합니다. 오라클 데이터베이스는 NULL 제한 속성 뒤에 기본값을 표시하면 에러가 발생합니다. 기본값은 NULL 제한 속성 앞에 표시해야 합니다.

CREATE TABLE IF NOT EXISTS maker (
  ID bigint NOT NULL,
  NAME varchar(20) default ‘’ NOT NULL
);

기본값 속성은 테이블에 행을 추가할 때 누락된 열에 데이터가 미 입력되는 것을 막는 역할을 합니다. 거기에 더해 NOT NULL 속성이 없어도 처음 행이 추가될 때 NULL이 입력되는 것을 막을 수는 있습니다. 다만, 행을 수정할 때는 NULL이 입력되는 것을 막을 수 있는 없습니다. 열에 NULL이 입력되는 것을 막으려면 NOT NULL 속성을 기본값과 별개로 꼭 지정해야 합니다.


자동 증가 속성

숫자 값이 자동으로 증가하는 열을 정의합니다. 속성 키워드는 “AUTO_INCREMENT”입니다. 데이터베이스에 따라 자동 증가 열을 정의하는 키워드와 사용 방법이 다릅니다.

자동 증가 값은 숫자 데이터 형인 열에만 사용할 수 있습니다.

MySQL은 열에 다음과 같이 “AUTO_INCREMENT” 속성을 지정해서 자동 증가 열을 정의합니다.

CREATE TABLE IF NOT EXISTS maker (
  ID bigint NOT NULL AUTO_INCREMENT,
  NAME varchar(20)
);

SQL Server는 “IDENTITY” 키워드를 사용합니다. SQL Server는 자동 증가 속성을 다양하게 설정할 수 있습니다. 앞서의 테이블 생성 쿼리문에 있는 id 열을 SQL Server용으로 변환하면 다음과 같습니다.

ID bigint IDENTITY(1,1) NOT NULL

IDENTITY 속성에 파라미터 2개를 추가로 넣을 수 있고, 첫 번째 파라미터는 시작 값, 두 번째 파라미터는 증가 값이 됩니다. IDENTITY(100,2)는 100에서 시작해 2씩 값이 증가하는 자동 증가 컬럼 값을 생성합니다.

문법이 조금 다르지만 오라클도 SQL Server처럼 IDENTITY 속성으로 시작 값과 증가 값 설정을 할 수 있습니다. 오라클은 문장형으로 “START WITH 시작 값 INCREMENT BY 증가 값 형식으로 IDENTITY 속성 파라미터를 작성할 수 있습니다.

ID number GENERATED BY DEFAULT AS IDENTITY (START WITH 1 INCREMENT BY 1)

자동 증가는 테이블 안에 여러 개를 정의할 수 있습니다. 다만 MySQL은 자동 증가 값이 1부터 시작해서 1씩 증가하는 것으로 고정되어 있기 때문에 여러 개의 열에 자동 증가를 적용하는 것이 의미는 없습니다.


유니크 값 속성

열에 중복 값이 저장되는 것을 막는 속성입니다. 열 안에 값은 유일해야 하며, 기본키는 아니지만 중복 값을 허용하고 싶지 않은 열에 사용하는 속성입니다. 기본키로 지정된 열은 자동으로 유니크 속성을 가지기 때문에 기본키에는 추가로 유니크 속성을 부여할 필요가 없습니다.

CREATE TABLE IF NOT EXISTS maker (
  ID bigint NOT NULL AUTO_INCREMENT PRIMARY KEY,
  NAME varchar(20) UNIQUE
);

기본키를 제외한 유니크 속성을 부여하고 싶은 열에 유니크 속성을 부여할 수 있으며, 한 테이블 안에 여러 개의 유니크 속성을 가진 열이 있을 수 있습니다.


테이블 삭제

기본 구문

delete from 테이블 이름;

테이블 삭제는 아주 간단합니다. 그리고 위험합니다. 테이블을 삭제할 때 아무런 확이 절차 없이 쿼리문 실행 즉시 삭제됩니다. 테이블 안에 중요한 데이터가 들어있을 때는 돌이길 수 없습니다. 항상 신중하게 삭제해야 합니다.

테이블 구조는 그대로 두고 데이터만 삭제하려면 TRUNCATE 명령어를 사용할 수 있습니다.

truncate table 테이블 이름;

Truncate는 DDL 명령어이며 DML의 테이블 행 삭제 명령어인 DELETE문으로도 데이터를 삭제할 수 있습니다.

“TRUNCATE”는 행단 위로 삭제하는 “DELETE”보다 처리 속도가 월등히 빠르기 때문에 많은 테이블 행을 가진 테이블의 내용을 모두 지울 때는 “TRUNCATE”를 사용하는 것이 유리합니다.


테이블 내용만 삭제하는 방식의 차이

TRUNCATE와 DELETE은 테이블 내용만 삭제하지만 차이점이 있습니다. DDL인 TRUNCATE는 모든 테이블을 일괄 삭제합니다. 삭제할 조건을 설정할 수 없으며, 무조건 전체 테이블을 일괄 삭제합니다. 테이블에 행 수가 많아도 빠르게 삭제가 되는 장점이 있습니다.

반면 DELETE는 행 단위 삭제가 기본입니다. 조건을 설정해 원하는 행만 삭제할 수 있습니다. 테이블 전체를 삭제하면 행 단위로 삭제가 되기 때문에 처리 속도가 느리고, 테이블에 행 수가 많을 경우 시간이 오래 걸릴 수 있습니다.

TRUNCATE로 삭제하면 테이블 내용은 일괄 삭제되지만, 자동 증가 값 등의 테이블 상태 속성은 그대로 유지됩니다. 테이블 속성까지 모두 초기화를 하려면 테이블을 삭제한 후 다시 생성해야 합니다.


테이블 수정

테이블의 열 데이터 형이나 속성을 변경해야 할 때 테이블이 비어 있으면 테이블을 삭제한 후 다시 만드는 것이 가장 빠르고 좋습니다.

테이블에 데이터가 들어있으면 테이블을 삭제할 수 없기 때문에 새 테이블을 만든 후 데이터를 이전하고 구 테이블을 삭제한 후 새 테이블의 이름을 바꾸는 번거로운 작업을 해야 합니다.

테이블 수정 명령어는 테이블 열의 데이터 형이나 속성을 수정해야 할 때 테이블 삭제 생성 없이 테이블의 열 정의를 수정할 수 있게 해 줍니다.

테이블 수정은 “ALTER TABLE” 문으로 수정합니다. 테이블 수정은 테이블 열 단위로만 한 개씩 실행할 수 있습니다. 여러 행을 수정하려면 열 개수만큼 수정 쿼리문을 실행해야 합니다.

그리고, 테이블을 생성할 때 사용 가능한 모든 속성, 제약 조건을 수정할 때 사용할 수는 없습니다. 주의해야 합니다.

테이블에 열을 추가, 수정, 삭제하는 방법을 차례로 알아보겠습니다.


테이블 열 추가

테이블에 열을 추가합니다.

기본 구문

alter table 테이블 이름 add 열 이름 데이터 형 열 속성;

앞서 만들었던 example1 테이블에 새 열을 하나 추가해보겠습니다.

alter table example1 add password varchar(30) not null default ‘’;

열을 추가하려면 ADD 절을 사용해 새로 추가할 열을 정의해야 합니다. “ADD” 키워드 뒤에 테이블을 추가할 때 열을 정의하는 것과 같은 방법으로 “`열 이름` 데이터 형 속성”을 표기해서 열을 정의합니다.

열을 추가한 후 “DESC example1;” 쿼리문으로 열이 추가되었는지 확인합니다.


테이블 열 속성 변경

테이블에 있는 열의 데이터 형이나 속성을 변경합니다. 이미 데이터가 들어있는 테이블인 경우 열의 데이터 형이나 속성을 변경하는데 제약이 있으므로 주의해서 변경해야 합니다.

기본 구문

alter table 테이블 이름 modify 열 이름 변경 데이터 형 변경 속성;

테이블에 이미 데이터가 들어있을 경우, 데이터 형을 변경하는데 제약이 있습니다. 변경하는 데이터 형이 열에 들어있는 데이터로 캐스팅이 가능하거나, 데이터의 최대 길이보다 커야 합니다.

속성 변경 또한 이미 들어있는 데이터가 변경하는 속성 제한을 위반하는 경우 속성을 변경할 수 없습니다.

앞서 추가했던 example1 테이블의 password 속성을 다른 속성으로 변경해 보겠습니다.

alter table example1 modify password varchar(20) not null;

MODIFY절 명령으로는 열 이름은 변경할 수 없습니다. 데이터 형과 속성만 변경할 수 있습니다. 컬럼의 길이를 더 짧게 변경할 경우 테이블에 들어있는 데이터의 길이가 변경한 길이보다 길면 에러가 발생하고 컬럼 정의를 변경할 수 없습니다.

NULL이 들어있는 컬럼의 속성을 NOT NULL로 변경하면 에러가 발생합니다.

SQL Server는 modify 키워드 대신 ALTER COLUMN 키워드를 사용합니다. 그리고 ADD COLUMN절로는 기본값을 수정할 수 없고, 다음과 같이 ADD DEFAULT 절로 기본값을 따로 설정해야 합니다.

ALTER TABLE example1 ADD DEFAULT '' FOR password;

오라클은 속성을 표시할 때 NOT NULL 앞에 기본값이 와야 합니다. 속성을 표시하는 순서에 따라 에러가 발생하는 데이터베이스가 있으므로 속성을 표시할 때는 기본값을 먼저 표시하는 것이 좋습니다.


열 이름 변경

열 이름 변경은 CHANGE 절로 변경할 수 있습니다. CHANGE 절은 이름 변경만이 아니라 MODIFY절의 데이터 형 및 속성 변경까지 지원합니다. 이름을 바꿀 때도 데이터 형은 명시를 해야 합니다. CHANGE 절은 이름을 바꾸는 전용 명령어가 아니라 MODIFY절의 확장이라고 생각하면 됩니다.

CHANGE 명령어는 MySQL 전용입니다. 데이터베이스마다 열 이름을 변경하는 명령어가 다르므로 구분해서 사용해야 합니다.

기본 구문

ALTER TABLE 테이블 이름 CHANGE [기존 열 이름] [새 열 이름] 데이터 형 속성;

앞서 새로 추가한 열인 “password”열의 이름을 “pwd”로 바꿔보겠습니다.

alter table example1 change password pwd varchar(20);

SQL Server는 열 이름을 바꾸는 ALTER TABLE 명령을 지원하지 않습니다. 대신 내장 스토어드 프로시저로 테이블 이름을 바꾸는 명령을 지원합니다. 앞서의 열 이름을 바꾸는 쿼리문은 SQL Server에서는 다음과 같이 사용해야 합니다.

EXEC sp_rename 'example1.password', 'pwd', 'COLUMN';

오라클 또한 컬럼 이름을 바꾸는 전용의 명령어인 ALTER TABLE에 RENAME COLUMN 절을 제공합니다.

alter table example1 Rename column password to pwd;

테이블 열 삭제

DROP 절로 테이블 열을 삭제할 수 있습니다.

기본 구문

alter table drop 열 이름;

테이블에 데이터가 들어있는 경우 삭제한 열의 데이터도 모두 삭제됩니다. 열을 삭제할 때는 신중하게 삭제해야 합니다. 기본키 컬럼은 삭제할 수 없습니다.