본문 바로가기

SQL

SQL CREATE TABLE로 테이블 생성하기 및 PK / FK 등 제약 조건 알아보기

 

오늘은 CREATE TABLE 명령어로 간단하게 테이블을 생성하는 방법에 대해서 알아보겠습니다.

사실 회사에서는 이미 구축되어 있는 DB 마트를 사용하고 개인 테이블은 회사 시스템 내에서 생성하기 때문에 CREATE TABLE로 테이블을 만들 일은 없지만 SQLD 시험 공부를 위해 정리해보고자 합니다.

 

국가공인 SQL자격증 - SQLD

 

 

CREATE TABLE로 테이블 생성

 

CREATE TABLE 테이블명
(컬럼1 데이터타입 조건,
 컬럼2 데이터타입 조건,
 컬럼3 데이터타입 조건,
 ....,
 )

 

SQL 데이터타입에 대한 자세한 설명은 아래 포스팅을 참고해주시기 바랍니다.

SQL 데이터타입

 

 

가장 기본적인 테이블 생성 방법입니다. 이제 여기에 추가로 제약 조건을 걸어서 PK나 FK 등을 설정해주어야 합니다. 기본키와 외래키는 테이블의 필수 요소로 모든 테이블은 기본키와 외래키 중 반드시 하나 이상을 포함해야 합니다.

 

 

*제약 조건

NOT NULL NULL값 허용X
UNIQUE 중복값 허용X
PRIMARY KEY(PK) 기본키, 테이블 당 한 개의 기본키만 생성 가능 (UNIQUE & NOT NULL)
FOREIGN KEY(FK) 외래키, 두 개의 테이블을 연결하는 다리 역할 (NULL가능, 여러개 가능)

 

우선 기본키는 테이블 당 한 개만 생성이 가능합니다. 기본키를 쓰면 한 테이블 내에서 고유한 행 선택이 가능하기 때문에 테이블에 중복 데이터가 들어가는 것을 방지합니다. 학번, 사번, 주민등록번호, 고객번호와 같이 데이터를 고유하게 식별할 수 있는 값을 PK로 사용합니다.

 

 

다음으로 외래키는 새롭게 추가되는 행에서 외래키에 해당하느 값이 외래키가 참조하는 테이블에 존재하는지를 확인하는 역할을 합니다. 예를 들어 고객 테이블에 새로운 데이터를 넣고자 하는데 외래키에 해당하는 고객번호가 아직 당사 고객이 아니라면 에러가 발생하면서 데이터 삽입이 불가능해집니다.

 

 

이렇게 외래키는 두 개의 테이블을 연결해주는 다리 역할을 하며 해당 레코드를 대표하는 기본키가 외래키로 설정될 수 있습니다. REFERENCES 키워드와 같이 사용됩니다.

 

 

기본키(PK) 제약조건 생성

--방법1
CREATE TABLE PRODUCT
(PROD_ID VARCHAR(10) NOT NULL,
 PROD_NM VARCHAR(100) NOT NULL,
 REG_DT DATE NOT NULL,
 REGR_NO NUMBER(10) NULL,
 CONSTRAINT PRODUCT_PK PRIMARY KEY (PROD_ID);
 
 --방법2
 CREATE TABLE PRODUCT
(PROD_ID VARCHAR(10) NOT NULL,
 PROD_NM VARCHAR(100) NOT NULL,
 REG_DT DATE NOT NULL,
 REGR_NO NUMBER(10) NULL);
 ALTER TABLE PRODUCT ADD CONSTRAINT PRODUCT_PK PRIMARY KEY (PROD_ID);

 

ALTER TABLE 구문을 사용해서 기본키 혹은 외래키를 생성하고자 할 때는 ADD CONSTRAINT를, 수정 혹은 삭제하고자 할 때는 DROP CONSTRAINT를 사용하면 됩니다.

 

 

외래키(FK) 제약조건 생성

CREATE TABLE PRODUCT
(PROD_ID VARCHAR(10) NOT NULL,
 PROD_NM VARCHAR(100) NOT NULL,
 REG_DT DATE NOT NULL,
 REGR_NO NUMBER(10) NULL,
 CONSTRAINT PRODUCT_FK FOREIGN KEY (PROD_ID) REFERENCES ORDERS (PROD_ID))
 PRIMARY KEY (PROD_ID);

 

외래키 생성 시 REFERENCES를 항상 같이 사용합니다. REFERENCES는 참조할 부모테이블과 부모테이블에 있는 컬럼을 정의하기 위한 명령어입니다. 여기에 추가로 ON DELETE CASCADE 또는 ON DELETE SET NULL로 옵션을 부여할 수도 있습니다.

 

*ON DELETE CASCADE

: 참조되는 부모테이블의 행이 지워지면 자식 테이블의 행도 같이 지워짐

(CASCADE는 하위 오브젝트까지 삭제하는 명령어)

 

*ON DELETE SET NULL

: 참조되는 부모테이블의 행이 지워지면 자식 테이블의 행은 NULL로 지정

 

 

테이블 컬럼 정의 변경

 

만약 생성한 테이블의 컬럼 데이터타입이나 NULL여부 등 정의를 변경하고 싶다면 아래와 같이 코드를 작성하면 됩니다.

--오라클
ALTER TABLE 테이블명
MODIFY (컬럼명1 데이터유형 조건,
		컬럼명2 데이터유형 조건
        ...
        )
        
--SQL Server
ALTER TABLE 테이블명
ALTER (컬럼명1 데이터유형 조건,
	   컬럼명2 데이터유형 조건,
       ...
       )

 

참고로 SQL서버에서는 여러 개의 컬럼을 동시에 수정하는 구문은 지원하지 않습니다. 따라서 여러개의 컬럼을 변경하고싶다면 ALTER문을 각각 작성해야 합니다.

 

ex)

ALTER TABLE 기관분류 ALTER COLUMN 분류명 VARCHAR(30) NOT NULL;
ALTER TABLE 기관분류 ALTER COLUMN 등록일자 DATE NOT NULL;