[SQLD] DDL(Data Definition Language)

Shy·2024년 5월 20일

SQLD

목록 보기
10/23

데이터 유형(Data Type)

1️⃣ 정의와 중요성

데이터 유형은 데이터베이스 테이블의 특정 칼럼에 입력될 자료의 종류를 정의하는 기준이다. 즉, 특정 칼럼을 정의할 때 지정한 데이터 유형은 그 칼럼이 받아들일 수 있는 데이터의 종류를 규정합니다. 예를 들어, 선수를 저장하는 테이블에서 ‘몸무게’ 칼럼에 ‘숫자’ 타입을 지정하면, 이 칼럼은 숫자만 입력받을 수 있고, 문자가 입력되면 에러가 발생한다.

2️⃣ 데이터 크기(SIZE)

데이터 유형과 더불어 크기(Size)도 중요하다. 선언 시 지정한 크기를 넘는 데이터가 입력되면 에러를 발생시키기 때문이다. 예를 들어 VARCHAR(40)으로 정의된 칼럼에는 최대 40자의 문자열만 입력할 수 있다.

3️⃣ 다양한 데이터 유형

데이터베이스 시스템은 다양한 데이터 유형을 제공합니다. 벤더별로 SQL 문법 차이는 점차 줄어들고 있지만, 데이터 유형과 내장 함수에서는 여전히 차이가 큽니다. 데이터베이스 내부 구조도 각기 다르지만, 여기서는 데이터 유형에 집중하겠습니다.

1. 숫자 타입

ANSI/ISO 표준에서는 NUMERIC Type 하위 개념으로 다양한 숫자 타입을 정의한다. 예를 들어, NUMERIC, DECIMAL, DEC, SMALLINT, INTEGER, INT, BIGINT, FLOAT, REAL, DOUBLE PRECISION 등이 있다. SQL Server와 Sybase는 이를 기반으로 작은 정수형, 정수형, 큰 정수형, 실수형 등의 숫자 타입을 제공하며, 추가로 MONEY, SMALLMONEY 등의 타입도 있다. 반면, Oracle은 NUMBER라는 하나의 숫자 타입만 지원한다.

2. 문자열 유형

문자열 데이터 유형에는 주로 CHAR와 VARCHAR가 사용된다. 이 둘의 차이는 저장 방식과 문자열 비교 방법에 있다.

  • CHAR: 고정 길이 문자형으로, 정의된 길이만큼 항상 공간을 차지한다. 문자열 비교 시 공백을 채워서 비교하므로, ‘AA’와 ’AA ’는 동일하게 간주된다.
  • VARCHAR: 가변 길이 문자형으로, 실제 데이터 길이만큼만 공간을 차지한다. 문자열 비교 시 공백도 문자로 취급하므로, ‘AA’와 ’AA ’는 다른 문자열로 간주된다.

예를 들어, VARCHAR(40)으로 정의된 칼럼에 ‘PARK,JISUNG’이 입력되면, 실제 데이터 길이인 11바이트만 차지합니다. 길이가 고정되지 않은 문자열 데이터의 경우 VARCHAR를 사용하는 것이 바람직하다.

데이터 유형 선택 시 고려사항

  • 데이터 크기와 정밀도: VARCHAR나 CHAR 유형의 최대 길이, NUMBER 유형의 정밀도(Precision) 등을 지정하는 것은 테이블 설계 시 중요한 요소이다. 잘못된 판단은 ALTER TABLE 명령으로 수정할 수 있지만, 데이터가 이미 입력된 상황에서는 처리 과정이 복잡해질 수 있다.
  • 문자열 비교 방법: CHAR와 VARCHAR의 문자열 비교 방식 차이를 고려해야 한다. 예를 들어, 공백이 포함된 문자열 비교가 중요한 경우 CHAR를, 그렇지 않은 경우 VARCHAR를 사용하는 것이 좋다.

CREATE TABLE

CREATE TABLE 문은 데이터베이스에서 테이블을 생성하는 SQL 명령어이다. 테이블은 데이터가 저장되는 구조이며, 각 데이터의 속성(칼럼)과 데이터 유형을 정의해야 한다. 테이블을 생성하기 위해서는 다음 단계를 따라야 한다

1️⃣ 테이블과 칼럼 정의

1. 기본키와 후보키

  • 기본키(PRIMARY KEY): 테이블 내의 데이터를 고유하게 식별할 수 있는 하나 이상의 칼럼으로 구성된다. 예를 들어, 선수 테이블의 ‘선수ID’ 칼럼이 기본키로 적합하다.
  • 후보키(Candidate Key): 기본키로 지정될 수 있는 칼럼들의 집합이다.

2. 외부키(FOREIGN KEY)

  • 외부키: 한 테이블의 칼럼이 다른 테이블의 기본키를 참조할 때 사용된다. 예를 들어, 선수 테이블에서 팀ID를 외부키로 참조하게 하여, 팀 테이블의 팀 정보를 참조할 수 있다.

3. 데이터 모델링 및 정규화

  • 정규화: 데이터베이스의 이상 현상을 방지하고 데이터를 효율적으로 관리하기 위해 테이블을 분리하는 과정이다. 팀 정보와 선수 정보를 분리하여 각각 팀 테이블과 선수 테이블로 나누는 것이 예이다.

2️⃣ CREATE TABLE 구문

업로드중..

CREATE TABLE 테이블이름 (
    칼럼명1 데이터유형 [DEFAULT],
    칼럼명2 데이터유형 [DEFAULT],
    ...
    [제약조건]
);

예제) Player 테이블 생성

K-리그 선수 정보를 저장하는 PLAYER 테이블을 생성하는 예제이다.

-- Oracle 예제
CREATE TABLE PLAYER (
    PLAYER_ID CHAR(7) NOT NULL,
    PLAYER_NAME VARCHAR2(20) NOT NULL,
    TEAM_ID CHAR(3) NOT NULL,
    E_PLAYER_NAME VARCHAR2(40),
    NICKNAME VARCHAR2(30),
    JOIN_YYYY CHAR(4),
    POSITION VARCHAR2(10),
    BACK_NO NUMBER(2),
    NATION VARCHAR2(20),
    BIRTH_DATE DATE,
    SOLAR CHAR(1),
    HEIGHT NUMBER(3),
    WEIGHT NUMBER(3),
    CONSTRAINT PLAYER_PK PRIMARY KEY (PLAYER_ID),
    CONSTRAINT PLAYER_FK FOREIGN KEY (TEAM_ID) REFERENCES TEAM(TEAM_ID)
);
-- SQL Server예제
CREATE TABLE PLAYER (
    PLAYER_ID CHAR(7) NOT NULL,
    PLAYER_NAME VARCHAR(20) NOT NULL,
    TEAM_ID CHAR(3) NOT NULL,
    E_PLAYER_NAME VARCHAR(40),
    NICKNAME VARCHAR(30),
    JOIN_YYYY CHAR(4),
    POSITION VARCHAR(10),
    BACK_NO TINYINT,
    NATION VARCHAR(20),
    BIRTH_DATE DATE,
    SOLAR CHAR(1),
    HEIGHT SMALLINT,
    WEIGHT SMALLINT,
    CONSTRAINT PLAYER_PK PRIMARY KEY (PLAYER_ID),
    CONSTRAINT PLAYER_FK FOREIGN KEY (TEAM_ID) REFERENCES TEAM(TEAM_ID)
);

주의사항 및 규칙

  • 테이블명과 칼럼명: 객체를 의미할 수 있는 적절한 이름을 사용하고, 단수형을 권장한다. 다른 테이블과 중복되지 않아야 하며, 테이블명과 칼럼명은 문자로 시작해야 한다.
  • 제약조건: 칼럼의 데이터 무결성을 유지하기 위해 제약조건을 정의합니다. NOT NULL, PRIMARY KEY, FOREIGN KEY 등이 있습니다.
  • 대/소문자 구분: SQL에서는 대소문자를 구분하지 않지만, 테이블과 칼럼명은 대문자로 작성하는 것이 일반적입니다.
  • 예약어: 벤더에서 사전에 정의한 예약어는 사용할 수 없습니다.
  • 허용 문자: A-Z, a-z, 0-9, _, $, # 문자만 허용됩니다.

예제 설명

  • PLAYER_ID: 고정 길이 7자리 CHAR 타입, NOT NULL로 설정하여 반드시 값이 존재하도록 합니다.
  • PLAYER_NAME: 가변 길이 20자리 VARCHAR 타입, NOT NULL로 설정합니다.
  • TEAM_ID: 고정 길이 3자리 CHAR 타입, NOT NULL로 설정합니다.
  • CONSTRAINT: PRIMARY KEY 및 FOREIGN KEY 제약조건을 정의하여 데이터 무결성을 유지합니다.

3️⃣ 제약조건(CONSTRAINT)

제약조건(CONSTRAINT)은 데이터베이스의 무결성을 유지하기 위해 테이블의 특정 칼럼에 설정하는 조건이다. 이는 데이터가 정확하고 일관성 있게 유지되도록 보장하는 역할을 한다.

1. 제약조건의 정의와 중요성

제약조건은 특정 조건을 만족하는 데이터만 테이블에 저장되도록 하는 방법이다. 테이블 생성 시 제약조건을 설정하면, 이후 데이터 입력 및 수정 시 자동으로 제약조건이 적용된다. 제약조건은 테이블 생성 시점에 설정하는 것이 좋다. 나중에 ALTER TABLE 명령으로 제약조건을 추가하거나 수정하는 경우 데이터가 이미 존재하면 복잡한 처리 과정을 거쳐야 하기 때문이다.

2. 제약조건의 종류

주요 제약조건의 종류는 다음과 같다.

  1. PRIMARY KEY: 테이블에서 각 행을 고유하게 식별하는 하나 이상의 칼럼을 지정한다. 기본키는 중복된 값을 가질 수 없으며 NULL 값을 허용하지 않는다.
  2. FOREIGN KEY: 한 테이블의 칼럼이 다른 테이블의 기본키를 참조하도록 한다. 이를 통해 테이블 간의 관계를 정의하고 데이터의 일관성을 유지한다.
  3. UNIQUE: 특정 칼럼에 중복된 값을 허용하지 않는다.
  4. NOT NULL: 해당 칼럼에 NULL 값을 허용하지 않는다.
  5. CHECK: 특정 조건을 만족하는 값만 허용한다.
  6. DEFAULT: 데이터 입력 시 명시된 값이 없으면 기본값을 설정한다.

NULL과 DEFAULT 의미

  • NULL: NULL은 정의되지 않은 미지의 값 또는 현재 데이터를 입력할 수 없는 경우를 의미한다. 공백(BLANK)이나 숫자 0(ZERO)과는 다르다.
  • DEFAULT: 데이터 입력 시 값이 명시되지 않은 경우 자동으로 입력될 기본값을 설정한다.

3. TEAM 테이블 생성 예제

K-리그 팀 정보를 저장하는 TEAM 테이블을 생성하는 예제를 통해 제약조건을 살펴보자.

CREATE TABLE TEAM (
    TEAM_ID CHAR(3) NOT NULL,
    REGION_NAME VARCHAR2(8) NOT NULL,
    TEAM_NAME VARCHAR2(40) NOT NULL,
    E_TEAM_NAME VARCHAR2(50),
    ORIG_YYYY CHAR(4),
    STADIUM_ID CHAR(3) NOT NULL,
    ZIP_CODE1 CHAR(3),
    ZIP_CODE2 CHAR(3),
    ADDRESS VARCHAR2(80),
    DDD VARCHAR2(3),
    TEL VARCHAR2(10),
    FAX VARCHAR2(10),
    HOMEPAGE VARCHAR2(50),
    OWNER VARCHAR2(10),
    CONSTRAINT TEAM_PK PRIMARY KEY (TEAM_ID),
    CONSTRAINT TEAM_FK FOREIGN KEY (STADIUM_ID) REFERENCES STADIUM(STADIUM_ID)
);
CREATE TABLE TEAM (
    TEAM_ID CHAR(3) NOT NULL,
    REGION_NAME VARCHAR(8) NOT NULL,
    TEAM_NAME VARCHAR(40) NOT NULL,
    E_TEAM_NAME VARCHAR(50),
    ORIG_YYYY CHAR(4),
    STADIUM_ID CHAR(3) NOT NULL,
    ZIP_CODE1 CHAR(3),
    ZIP_CODE2 CHAR(3),
    ADDRESS VARCHAR(80),
    DDD VARCHAR(3),
    TEL VARCHAR(10),
    FAX VARCHAR(10),
    HOMEPAGE VARCHAR(50),
    OWNER VARCHAR(10),
    CONSTRAINT TEAM_PK PRIMARY KEY (TEAM_ID),
    CONSTRAINT TEAM_FK FOREIGN KEY (STADIUM_ID) REFERENCES STADIUM(STADIUM_ID)
);

4. 테이블 생성 시 주의사항

  • 대/소문자 구분: 기본적으로 테이블명과 칼럼명은 대문자로 작성된다.
  • DATETIME 데이터 유형: 별도의 크기를 지정하지 않는다.
  • 문자 데이터 유형: 최대 길이를 반드시 지정한다.
  • 콤마 사용: 칼럼과 칼럼을 콤마로 구분하지만, 마지막 칼럼 뒤에는 콤마를 사용하지 않는다.
  • 제약조건 설정: 제약조건은 칼럼 레벨과 테이블 레벨에서 설정할 수 있다. 하나의 SQL 문장에서 두 가지 방식을 혼용할 수 있다.

4️⃣ 생성된 테이블 구조 확인

테이블을 생성한 후에는 테이블의 구조가 올바르게 생성되었는지 확인하는 것이 중요하다. 이를 위해 각 DBMS에서 제공하는 명령어를 사용할 수 있다.

1. Oracle 명령어

명령어: DESCRIBE 테이블명; 또는 DESC 테이블명;

DESC PLAYER;
-- 결과
칼럼            NULL 가능    데이터 유형
-------------   ---------   --------------
PLAYER_ID       NOT NULL    CHAR(7)
PLAYER_NAME     NOT NULL    VARCHAR2(20)
TEAM_ID         NOT NULL    CHAR(3)
E_PLAYER_NAME              VARCHAR2(40)
NICKNAME                   VARCHAR2(30)
JOIN_YYYY                  CHAR(4)
POSITION                   VARCHAR2(10)
BACK_NO                    NUMBER(2)
NATION                     VARCHAR2(20)
BIRTH_DATE                 DATE
SOLAR                      CHAR(1)
HEIGHT                     NUMBER(3)
WEIGHT                     NUMBER(3)

2. SQL Server

  • 명령어: sp_help 'dbo.테이블명'
exec sp_help 'dbo.PLAYER';
-- 결과
칼럼이름       데이터 유형  길이  NULL 가능
------------   -----------  ----  ---------
PLAYER_ID      CHAR(7)      7     NO
PLAYER_NAME    VARCHAR(20)  20    NO
TEAM_ID        CHAR(3)      3     NO
E_PLAYER_NAME  VARCHAR(40)  40    YES
NICKNAME       VARCHAR(30)  30    YES
JOIN_YYYY      CHAR(4)      4     YES
POSITION       VARCHAR(10)  10    YES
BACK_NO        TINYINT      1     YES
NATION         VARCHAR(20)  20    YES
BIRTH_DATE     DATE         3     YES
SOLAR          CHAR(1)      1     YES
HEIGHT         SMALLINT     2     YES
WEIGHT         SMALLINT     2     YES

5️⃣ SELECT 문장을 통한 테이블 생성 사례

기존 테이블의 데이터를 새로운 테이블로 복사하여 생성할 수 있다. 이를 통해 데이터 유형을 다시 정의하지 않아도 되며, NOT NULL 제약 조건만 적용된다. 기본키, 고유키, 외래키, CHECK 등의 다른 제약 조건은 새로운 테이블에 자동으로 적용되지 않으므로, 필요시 ALTER TABLE 명령을 사용해야 한다.

1. Oracle

CREATE TABLE TEAM_TEMP AS SELECT * FROM TEAM;
-- 결과 확인
DESC TEAM_TEMP;
-- 결과
칼럼          NULL 가능    데이터 유형
------------- ----------- --------------
TEAM_ID       NOT NULL    CHAR(3)
REGION_NAME   NOT NULL    VARCHAR2(8)
TEAM_NAME     NOT NULL    VARCHAR2(40)
E_TEAM_NAME               VARCHAR2(50)
ORIG_YYYY                 CHAR(4)
STADIUM_ID    NOT NULL    CHAR(3)
ZIP_CODE1                 CHAR(3)
ZIP_CODE2                 CHAR(3)
ADDRESS                   VARCHAR2(80)
DDD                       VARCHAR2(3)
TEL                       VARCHAR2(10)
FAX                       VARCHAR2(10)
HOMEPAGE                  VARCHAR2(50)
OWNER                     VARCHAR2(10)

2. SQL Server

SELECT * INTO TEAM_TEMP FROM TEAM;
-- 결과 확인
exec sp_help 'dbo.TEAM_TEMP';
-- 결과
칼럼이름      데이터 유형  길이  NULL 가능
------------  -----------  ----  ---------
TEAM_ID       CHAR(3)      3     NO
REGION_NAME   VARCHAR(8)   8     NO
TEAM_NAME     VARCHAR(40)  40    NO
E_TEAM_NAME   VARCHAR(50)  50    YES
ORIG_YYYY     CHAR(4)      4     YES
STADIUM_ID    CHAR(3)      3     NO
ZIP_CODE1     CHAR(3)      3     YES
ZIP_CODE2     CHAR(3)      3     YES
ADDRESS       VARCHAR(80)  80    YES
DDD           VARCHAR(3)   3     YES
TEL           VARCHAR(10)  10    YES
FAX           VARCHAR(10)  10    YES
HOMEPAGE      VARCHAR(50)  50    YES
OWNER         VARCHAR(10)  10    YES

이렇게 생성된 테이블의 구조를 확인하면, 데이터 유형과 NULL 가능 여부 등을 확인할 수 있다. CTAS(CREATE TABLE AS) 방법을 통해 테이블을 생성할 때 주의할 점은 기존 테이블의 일부 제약 조건이 새로운 테이블에 적용되지 않는다는 것이다. 필요한 경우, 추가적인 제약 조건을 ALTER TABLE 문을 통해 설정해야 한다.

ALTER TABLE

테이블이 처음 생성된 후, 시간이 지나면서 업무적인 요구 사항이나 시스템 운영상의 이유로 테이블의 구조를 변경해야 할 일이 생길 수 있다. 이를 위해 ALTER TABLE 명령을 사용하여 테이블의 구조를 수정할 수 있다. 주로 칼럼을 추가/삭제하거나 제약조건을 추가/삭제하는 작업이 이루어진다.

1️⃣ ADD COULUMN

기존 테이블에 새로운 칼럼을 추가할 때 사용되는 명령이다.

ALTER TABLE 테이블명 ADD 추가할 칼럼명 데이터 유형;

주의사항으로, 새롭게 추가된 칼럼은 테이블의 마지막 칼럼이 되며, 칼럼의 위치를 지정할 수 없다.

1. Oracle

ALTER TABLE PLAYER ADD (ADDRESS VARCHAR2(80));
-- 결과 확인
DESC PLAYER;
-- 결과
칼럼            NULL 가능    데이터 유형
-------------   ---------   --------------
PLAYER_ID       NOT NULL    CHAR(7)
PLAYER_NAME     NOT NULL    VARCHAR2(20)
TEAM_ID         NOT NULL    CHAR(3)
E_PLAYER_NAME              VARCHAR2(40)
NICKNAME                   VARCHAR2(30)
JOIN_YYYY                  CHAR(4)
POSITION                   VARCHAR2(10)
BACK_NO                    NUMBER(2)
NATION                     VARCHAR2(20)
BIRTH_DATE                 DATE
SOLAR                      CHAR(1)
HEIGHT                     NUMBER(3)
WEIGHT                     NUMBER(3)
ADDRESS                    VARCHAR2(80)  -- 추가된 열

2. SQL Server

ALTER TABLE PLAYER ADD ADDRESS VARCHAR(80);
-- 결과 확인
exec sp_help 'dbo.PLAYER';
-- 결과
칼럼이름       데이터 유형  길이  NULL 가능
------------   -----------  ----  ---------
PLAYER_ID      CHAR(7)      7     NO
PLAYER_NAME    VARCHAR(20)  20    NO
TEAM_ID        CHAR(3)      3     NO
E_PLAYER_NAME  VARCHAR(40)  40    YES
NICKNAME       VARCHAR(30)  30    YES
JOIN_YYYY      CHAR(4)      4     YES
POSITION       VARCHAR(10)  10    YES
BACK_NO        TINYINT      1     YES
NATION         VARCHAR(20)  20    YES
BIRTH_DATE     DATE         3     YES
SOLAR          CHAR(1)      1     YES
HEIGHT         SMALLINT     2     YES
WEIGHT         SMALLINT     2     YES
ADDRESS        VARCHAR(80)  80    YES  -- 추가된 열

2️⃣ DROP COLUMN

DROP COLUMN은 테이블에서 더 이상 필요하지 않은 칼럼을 삭제할 때 사용하는 명령어이다. 삭제하려는 칼럼에 데이터가 있든 없든 상관없이 삭제가 가능하다. 하지만 한 번에 하나의 칼럼만 삭제할 수 있으며, 테이블에는 최소한 하나 이상의 칼럼이 남아 있어야 한다. 삭제된 칼럼은 복구가 불가능하므로 주의해야 한다.

ALTER TABLE 테이블명 DROP COLUMN 삭제할 칼럼명;

1. Oracle

ALTER TABLE PLAYER DROP COLUMN ADDRESS;
-- 결과 확인
DESC PLAYER;
-- 결과
칼럼            NULL 가능    데이터 유형
-------------   ---------   --------------
PLAYER_ID       NOT NULL    CHAR(7)
PLAYER_NAME     NOT NULL    VARCHAR2(20)
TEAM_ID         NOT NULL    CHAR(3)
E_PLAYER_NAME              VARCHAR2(40)
NICKNAME                   VARCHAR2(30)
JOIN_YYYY                  CHAR(4)
POSITION                   VARCHAR2(10)
BACK_NO                    NUMBER(2)
NATION                     VARCHAR2(20)
BIRTH_DATE                 DATE
SOLAR                      CHAR(1)
HEIGHT                     NUMBER(3)
WEIGHT                     NUMBER(3)

2. SQL Server

ALTER TABLE PLAYER DROP COLUMN ADDRESS;
-- 결과 확인
exec sp_help 'dbo.PLAYER';
-- 결과
칼럼이름       데이터 유형  길이  NULL 가능
------------   -----------  ----  ---------
PLAYER_ID      CHAR(7)      7     NO
PLAYER_NAME    VARCHAR(20)  20    NO
TEAM_ID        CHAR(3)      3     NO
E_PLAYER_NAME  VARCHAR(40)  40    YES
NICKNAME       VARCHAR(30)  30    YES
JOIN_YYYY      CHAR(4)      4     YES
POSITION       VARCHAR(10)  10    YES
BACK_NO        TINYINT      1     YES
NATION         VARCHAR(20)  20    YES
BIRTH_DATE     DATE         3     YES
SOLAR          CHAR(1)      1     YES
HEIGHT         SMALLINT     2     YES
WEIGHT         SMALLINT     2     YES

3️⃣ MODIFY COLUMN

기존 테이블의 칼럼 데이터 유형, 디폴트 값, NOT NULL 제약조건 등을 변경할 수 있다. 칼럼의 크기를 늘릴 수는 있지만 줄이지는 못하며, NULL 값을 가지고 있는 경우에만 크기를 줄일 수 있다. 칼럼의 데이터 유형 변경도 NULL 값을 가진 경우에만 가능하다. DEFAULT 값을 변경하면 이후 삽입되는 행에만 영향을 미친다.

-- Oracle
ALTER TABLE 테이블명 MODIFY (칼럼명1 데이터 유형 [DEFAULT] [NOT NULL], 칼럼명2 데이터 유형 …);

-- SQL Server
ALTER TABLE 테이블명 ALTER (칼럼명1 데이터 유형 [DEFAULT] [NOT NULL], 칼럼명2 데이터 유형 …);

Oracle

ALTER TABLE TEAM_TEMP MODIFY (ORIG_YYYY VARCHAR2(8) DEFAULT '20020129' NOT NULL);

-- 결과 확인
DESC TEAM_TEMP;

-- 결과
칼럼            NULL 가능    데이터 유형
-------------   ---------   --------------
TEAM_ID         NOT NULL    CHAR(3)
REGION_NAME     NOT NULL    VARCHAR2(8)
TEAM_NAME       NOT NULL    VARCHAR2(40)
E_TEAM_NAME                VARCHAR2(50)
ORIG_YYYY       NOT NULL    VARCHAR2(8)  -- 기본값 '20020129'
STADIUM_ID      NOT NULL    CHAR(3)
ZIP_CODE1                  CHAR(3)
ZIP_CODE2                  CHAR(3)
ADDRESS                    VARCHAR2(80)
DDD                        VARCHAR2(3)
TEL                        VARCHAR2(10)
FAX                        VARCHAR2(10)
HOMEPAGE                   VARCHAR2(50)
OWNER                      VARCHAR2(10)

SQL Server

ALTER TABLE TEAM_TEMP ALTER COLUMN ORIG_YYYY VARCHAR(8) NOT NULL;

-- 추가로 DEFAULT값 설정
ALTER TABLE TEAM_TEMP ADD CONSTRAINT DF_ORIG_YYYY DEFAULT '20020129' FOR ORIG_YYYY;

-- 결과 확인
exec sp_help 'dbo.TEAM_TEMP';

-- 결과
칼럼이름      데이터 유형  길이  NULL 가능
------------  -----------  ----  ---------
TEAM_ID       CHAR(3)      3     NO
REGION_NAME   VARCHAR(8)   8     NO
TEAM_NAME     VARCHAR(40)  40    NO
E_TEAM_NAME   VARCHAR(50)  50    YES
ORIG_YYYY     VARCHAR(8)   8     NO  -- 기본값 '20020129'
STADIUM_ID    CHAR(3)      3     NO
ZIP_CODE1     CHAR(3)      3     YES
ZIP_CODE2     CHAR(3)      3     YES
ADDRESS       VARCHAR(80)  80    YES
DDD           VARCHAR(3)   3     YES
TEL           VARCHAR(10)  10    YES
FAX           VARCHAR(10)  10    YES
HOMEPAGE      VARCHAR(50)  50    YES
OWNER         VARCHAR(10)  10    YES

3️⃣ - 2️⃣ RENAME COLUMN

칼럼명을 변경해야 할 때 사용하는 명령어다. 이 명령어는 일부 DBMS에서만 지원된다. Oracle에서는 ALTER TABLE RENAME COLUMN 문을 사용하고, SQL Server에서는 sp_rename 저장 프로시저를 사용한다.

-- Oracle
ALTER TABLE 테이블명 RENAME COLUMN 기존칼럼명 TO 새로운칼럼명;

-- SQL Server
sp_rename 'dbo.테이블명.기존칼럼명', '새로운칼럼명', 'COLUMN';

Oracle

PLAYER 테이블에서 PLAYER_ID를 TEMP_ID로, 다시 PLAYER_ID로 변경

ALTER TABLE PLAYER RENAME COLUMN PLAYER_ID TO TEMP_ID;
ALTER TABLE PLAYER RENAME COLUMN TEMP_ID TO PLAYER_ID;

SQL Server

sp_rename 'dbo.PLAYER.PLAYER_ID', 'TEMP_ID', 'COLUMN';
sp_rename 'dbo.PLAYER.TEMP_ID', 'PLAYER_ID', 'COLUMN';

이와 같은 방법으로 테이블의 칼럼을 추가, 삭제, 수정 및 이름 변경할 수 있다. 각 명령을 사용할 때는 데이터 무결성과 기존 데이터를 고려하여 신중히 수행해야 한다.

4️⃣ DROP CONSTRAINT

DROP CONSTRAINT는 테이블 생성 시 설정된 제약조건을 삭제할 때 사용하는 명령어이다. 제약조건을 삭제하면, 그 제약조건에 의해 보호되던 데이터 무결성 조건이 해제된다.

ALTER TABLE 테이블명 DROP CONSTRAINT 제약조건명;

아래는 PLAYER 테이블의 외래키 제약조건을 삭제하는 예제이다.

1. Oracle

ALTER TABLE PLAYER DROP CONSTRAINT PLAYER_FK;

2. SQL Server

ALTER TABLE PLAYER DROP CONSTRAINT PLAYER_FK;

5️⃣ ADD CONSTRAINT

ADD CONSTRAINT는 테이블 생성 후에도 필요에 따라 제약조건을 추가할 수 있게 한다. 특정 칼럼에 제약조건을 추가하여 데이터 무결성을 강화할 수 있다.

ALTER TABLE 테이블명 ADD CONSTRAINT 제약조건명 제약조건 (칼럼명);

아래는 PLAYER 테이블에 외래키 제약조건을 추가하는 예제이다.

1. Oracle

ALTER TABLE PLAYER ADD CONSTRAINT PLAYER_FK FOREIGN KEY (TEAM_ID) REFERENCES TEAM(TEAM_ID);

2. SQL Server

ALTER TABLE PLAYER ADD CONSTRAINT PLAYER_FK FOREIGN KEY (TEAM_ID) REFERENCES TEAM(TEAM_ID);

참조 무결성 확인

외래키 제약조건을 추가하면, 참조 무결성 옵션에 따라 부모 테이블이나 부모 테이블의 데이터를 삭제하려고 할 때 제약조건이 작동하여 삭제를 막는다.

Oracle

DROP TABLE TEAM;
-- 결과: ERROR: 외래 키에 의해 참조되는 고유/기본 키가 테이블에 있다. ※ 테이블은 삭제되지 않음

SQL Server

DROP TABLE TEAM;
-- 결과: ERROR: 엔터티 ‘TEAM’은 FOREIGN KEY 제약 조건을 참조하므로 삭제할 수 없다. ※ 테이블은 삭제되지 않음

부모 테이블의 특정 데이터 삭제 시도

Oracle

DELETE FROM TEAM WHERE TEAM_ID = 'K10';
-- ERROR: 무결성 제약조건(SCOTT.PLAYER_FK)이 위배되었다. 자식 레코드가 발견되었다. ※ 데이터는 삭제되지 않음

SQL Server

DELETE FROM TEAM WHERE TEAM_ID = 'K10';
-- 결과: ERROR: FOREIGN KEY 제약 조건을 참조하므로 삭제할 수 없다. ※ 데이터는 삭제되지 않음

RENAME TABLE

RENAME 명령어를 사용하면 테이블의 이름을 변경할 수 있다. 이는 테이블 구조나 데이터에는 영향을 미치지 않고, 단지 테이블의 이름만 변경한다.

RENAME 변경전 테이블명 TO 변경후 테이블명;

SQL Server에서는 sp_rename 저장 프로시저를 사용하여 테이블 이름을 변경한다.

sp_rename '변경전 테이블명', '변경후 테이블명';

아래는 TEAM 테이블명을 TEAM_BACKUP으로 변경하고 다시 TEAM으로 변경하는 예제이다.

Oracle

RENAME TEAM TO TEAM_BACKUP;
-- 결과: 테이블 이름이 변경되었다.
RENAME TEAM_BACKUP TO TEAM;
-- 결과: 테이블 이름이 변경되었다.

SQL Server

sp_rename 'dbo.TEAM', 'TEAM_BACKUP';
-- 주의: 엔터티 이름 부분을 변경하면 스크립트 및 저장 프로시저를 손상시킬 수 있다.
sp_rename 'dbo.TEAM_BACKUP', 'TEAM';
-- 주의: 엔터티 이름 부분을 변경하면 스크립트 및 저장 프로시저를 손상시킬 수 있다.

이와 같이 ALTER TABLE과 RENAME 명령을 사용하면 데이터베이스 테이블의 구조를 유연하게 변경하고 관리할 수 있습니다. 그러나 이러한 작업을 수행할 때는 데이터 무결성을 유지하고, 변경으로 인한 영향을 최소화하기 위해 신중히 계획하고 실행해야 합니다.

DROP TABLE

DROP TABLE 명령은 테이블을 완전히 삭제할 때 사용된다. 이 명령은 테이블의 데이터와 구조를 모두 제거한다. CASCADE CONSTRAINT 옵션을 사용하면 해당 테이블과 관계가 있는 참조 제약조건들도 함께 삭제한다.

DROP TABLE 테이블명 [CASCADE CONSTRAINT];

SQL Server에서는 CASCADE CONSTRAINT 옵션이 없으므로, 테이블을 삭제하기 전에 참조하는 FOREIGN KEY 제약조건을 수동으로 삭제해야 한다.

아래는 PLAYER 테이블을 삭제하는 예제이다.

Oracle

DROP TABLE PLAYER;

-- 결과 확인
DESC PLAYER;

-- 결과
-- ERROR: 설명할 객체를 찾을 수 없다.

SQL Server

DROP TABLE PLAYER;

-- 결과 확인
exec sp_help 'dbo.PLAYER';

-- 결과
-- 메시지 15009, 수준 16, 상태 1, 프로시저 sp_help, 줄 66 데이터베이스 ‘northwind'에 엔터티 'dbo.player'이(가) 없거나 이 작업에 적합하지 않다.

TRUNCATE TABLE

TRUNCATE TABLE 명령은 테이블의 데이터만 모두 삭제하고, 테이블 구조는 유지한다. 이 명령을 사용하면 테이블의 모든 행이 제거되고, 저장 공간이 재사용 가능하다. TRUNCATE TABLE은 데이터 구조 변경 없이 데이터를 일괄 삭제하므로 성능 면에서 효율적이다. 다만, 정상적인 복구가 불가능하므로 주의가 필요하다.

TRUNCATE TABLE 테이블명;

아래는 TEAM 테이블의 모든 행을 삭제하는 예제이다.

Oracle

TRUNCATE TABLE TEAM;

-- 결과 확인
DESC TEAM;

-- 결과
칼럼            NULL 가능    데이터 유형
-------------   ---------   --------------
TEAM_ID         NOT NULL    CHAR(3)
REGION_NAME     NOT NULL    VARCHAR2(8)
TEAM_NAME       NOT NULL    VARCHAR2(40)
E_TEAM_NAME                VARCHAR2(50)
ORIG_YYYY                  CHAR(4)
STADIUM_ID      NOT NULL    CHAR(3)
ZIP_CODE1                  CHAR(3)
ZIP_CODE2                  CHAR(3)
ADDRESS                    VARCHAR2(80)
DDD                        VARCHAR2(3)
TEL                        VARCHAR2(10)
FAX                        VARCHAR2(10)
HOMEPAGE                   VARCHAR2(50)
OWNER                      VARCHAR2(10)

SQL Server

TRUNCATE TABLE TEAM;

-- 결과 확인
exec sp_help 'dbo.TEAM';

-- 결과
칼럼이름        데이터 유형  길이  NULL 가능
------------    -----------  ----  ---------
TEAM_ID         CHAR(3)      3     NO
REGION_NAME     VARCHAR(8)   8     NO
TEAM_NAME       VARCHAR(40)  40    NO
E_TEAM_NAME     VARCHAR(50)  50    YES
ORIG_YYYY       CHAR(4)      4     YES
STADIUM_ID      CHAR(3)      3     NO
ZIP_CODE1       CHAR(3)      3     YES
ZIP_CODE2       CHAR(3)      3     YES
ADDRESS         VARCHAR(80)  80    YES
DDD             VARCHAR(3)   3     YES
TEL             VARCHAR(10)  10    YES
FAX             VARCHAR(10)  10    YES
HOMEPAGE        VARCHAR(50)  50    YES
OWNER           VARCHAR(10)  10    YES

DROP TABLE과 TRUNCATE TABLE 비교

  • DROP TABLE: 테이블의 데이터와 구조를 모두 삭제한다. 테이블 자체가 없어지므로 테이블 구조를 확인할 수 없다.
  • TRUNCATE TABLE: 테이블의 데이터만 삭제하고, 테이블 구조는 유지한다. 테이블 구조를 그대로 두고 데이터를 초기화하는 데 유용하다.

DELETE와 TRUNCATE의 차이점

  • DELETE: 특정 조건에 맞는 행을 삭제할 수 있으며, 트랜잭션 로그를 남긴다. 성능이 상대적으로 느리지만, 데이터 복구가 가능하다.
  • TRUNCATE: 테이블의 모든 행을 빠르게 삭제하며, 트랜잭션 로그를 최소화한다. 성능이 우수하지만 데이터 복구가 불가능하다.

테이블의 데이터를 삭제할 때 시스템 부하를 고려한다면 TRUNCATE TABLE을 사용하는 것이 좋다. 다만, 복구가 불가능하므로 주의해서 사용해야 한다.

profile
신입사원...

0개의 댓글