전공 지식 정리/데이터베이스 설계

데이터베이스 SQL문 DDL

2022. 10. 24. 00:51

 

테이블 생성 규칙

 테이블명 : 객체를 의미할 수 있는 이름으로 단수형 권고, 다른 테이블명과 중복X

 컬럼명 : 한 테이블 내에서 컬럼명 중복X, 테이블 생성시 각 컬럼들은 괄호 내에서 콤마로 구분됨,

컬럼 뒤에 데이터 유형이 반드시 지정되어야 함

 테이블명 & 컬럼명

사전에 정의된 예약어는 사용 불가,

테이블명과 컬럼명에는 문자, 숫자, 일부기호(_,$,#)만 허용됨,

테이블명과 컬럼명은 반드시 문자로 시작해야함

제약조건명 : 다른 제약조건명과 중복X

 

Oracle의 주요 데이터 타입

CHAR : 고정 문자열, 나머지 공간에 공백이 채워진다. ('AA' = 'AA  ')

VARCHAR2 : 가변 길이 문자열, 나머지 공간 사용X ('AA != 'AA  ')

NUMBER : 정수, 실수 등의 숫자정보이다. 

전체 자리수와 소수 부분 자리수를 명시한다. NUMBER(8,2) : 정수부분 6자리, 소수부분 2자리

DATE : 날짜와 시각 정보

 

제약조건

PRIMARY KEY : 기본키를 정의한다. (하나의 테이블에 하나의 기본키 제약만 정의 가능), NOT NULL & UNIQUE

FOREIGN KEY : 다른 테이블의 기본키를 참조하는 외래키를 지정한다.

NOT NULL : NULL 값의 입력을 허용하지 않는 제약조건이다.

UNIQUE : 해당 칼럼의 값이 테이블내에서 유일해야함을 제약하는 조건이다.

CHECK : 입력할 수 있는 값을 제한하는 조건이다.

 

ddl7주차 7페이지ppt 식별비식별 한번 더 확인하고 공부해보자

 

테이블 생성 SQL문

-- STADIUM TABLE
CREATE TABLE STADIUM (

STADIUM_ID		CHAR(3) NOT NULL,
STADIUM_NAME		VARCHAR2(40) NOT NULL,
HOMETEAM_ID		CHAR(3),
SEAT_COUNT		NUMBER,
ADDRESS			VARCHAR2(60),
DDD			VARCHAR2(3),
TEL			VARCHAR2(10),
CONSTRAINT		STADIUM_PK PRIMARY KEY(STADIUM_ID)
);

여기서 STADIUM_PK는 제약식의 이름이고,

PRIMARY KEY(STADIUM_ID)는 STADIUM_ID를 기본키로 한다는 제약조건을 준 것이다.

 

-- TEAM TABLE
CREATE TABLE TEAM (
--
--
CONSTRAINT TEAM_PK PRIMARY KEY (TEAM_ID),
-- STADIUM 테이블이 먼저 생성되어 있어야 한다.
CONSTRAINT TEAM_FK FOREIGN KEY (STADIUM_ID) REFERENCES STADIUM(STADIUM_ID)
);

TEAM_FK가 제약명이고, STADIUM 테이블의 STADIUM_ID를 참조하는 외래키를 지정한 것이다.

 

CREATE TABLE PLAYER (
--
--
CONSTRAINT PLAYER_PK PRIMARY_KEY (PLAYER_ID),
-- TEAM 테이블이 먼저 생성되어 있어야 함
CONSTRAINT PLAYER_FK FOREIGN KEY (TEAM_ID) REFERENCES TEAM(TEAM_ID)
);

 

CREATE TABLE SCHEDULE (
--
--
CONSTRAINT SCHEDULE_PK PRIMARY KEY (STADIUM_ID, SCHE_DATE),
-- STADIUM 테이블이 먼저 생성되어 있어야 함
CONSTRAINT SCHEDULE_FK FOREIGN KEY (STADIUM_ID) REFERENCES STADIUM(STADIUM_ID)
);

 

제약 조건의 지정

-- CASCADE CONSTRAINTS 는 부모 TABLE을 삭제하고
-- 자식 TABLE의 FOREIGN KEY CONSTRAINT도 삭제한다. 
DROP TABLE PLAYER1 CASCADE CONSTRAINT;

CREATE TABLE PLAYER1 (
	PLAYER_ID CHAR(7) PRIMARY KEY,
    PLAYER_NAME VARCHAR2(20) NOT NULL,
    NICKNAME VARCHAR2(30) UNIQUE,
    HEIGHT NUMBER(3) CHECK (HEIGHT >= 140 AND HEIGHT <= 200),
    TEAM_ID CHAR(3) REFERENCES TEAM(TEAM_ID)
);
DROP TABLE PLAYER2 CASCADE CONSTRAINT;

CREATE TABLE PLAYER2 (
	PLAYER_ID CHAR(7) CONSTRAINT p2_pk_id PRIMARY KEY,
    PLAYER_NAME VARCHAR2(20) CONSTRAINT p2_nn_name NOT NULL,
    --
    --
    --
);
DROP TABLE PLAYER3 CASCADE CONSTRAINT;

CREATE TABLE PLAYER3 (
	PLAYER_ID CHAR(7),
    PLAYER_NAME VARCHAR2(20) CONSTARINT p3_nn_name NOT NULL,
    NICKNAME VARCHAR2(30),
    HEIGHT NUMBER(3),
    TEAM_ID CHAR(3),
    
    CONSTRAINT p3_pk_id PRIMARY KEY (PLAYER_ID),
    CONSTRAINT p3_un_nick UNIQUE (NICKNAME),
    CONSTRAINT p3_ck_height CHECK (HEIGHT >= 140 AND HEIGHT <= 200),
    CONSTRAINT p3_fk_tid FOREIGN KEY (TEAM_ID) REFERENCES TEAM(TEAM_ID)
);

 

제약 조건의 확인

SELECT * FROM ALL_CONSTRAINTS
WHERE TABLE_NAME IN ('PLAYER1', 'PLAYER2', 'PLAYER3')
ORDER BY CONSTRAINT_NAME

 

FK 제약 조건의 옵션

CONSTRAINT fk1 FOREIGN KEY (TEAM_ID) REFERENCES TEAM(TEAM_ID)
ON DELETE CASCADE ON UPDATE RESTRICT;
-- ON DELETE CASCADE : 기본키 삭제되면 해당 값을 외래키로 갖는 레코드도 삭제
-- ON UPDATE RESTRICT : 기본값의 갱신을 불허

ON UPDATE (RESTRICT) , ON UPDATE (RESTRICT)

RESTRICT는 디폴트 값이다.

NO ACTION은 RESTRICT와 동일하게 동작한다.

-- ON DELETE CASCADE : 기본키가 삭제되면 해당 값을 외래키로 갖는 레코드도 삭제
-- ON UPDATE CASCADE : 기본키가 갱신되면 이를 참조하는 외래키를 새로운 값으로 업데이트
-- ON DELETE SET NULL
-- ON UPDATE SET NULL
: 기본키가 삭제 또는 갱신되면 이를 참조하는 외래키를 NULL로 업데이트

 

기존 테이블을 활용한 테이블 생성 (SELECT문 활용)

DROP TABLE PLAYER_TEMP CASCADE CONSTRAINT;

CREATE TABLE PLAYER_TEMP AS SELECT * FROM PLAYER;

-- 생성한 테이블 제약조건 확인해보기
SELECT * FROM ALL_CONSTRAINTS
WHERE TABLE_NAME IN ('PLAYER', 'PLAYER_TEMP') ORDER BY TABLE_NAME;

제약 조건은 NOT NULL 만 복제된다.

따라서 PK, FK, UNIQUE, CHECK 등은 수동으로 추가해주어야 한다.

 

ALTER 문을 통한 테이블 변경

-- 컬럼의 추가 (ADD)
ALTER TABLE PLAYER_TEMP ADD (ADDRESS VARCHAR2(80));

-- 컬럼의 삭제 (DROP COLUMN)
-- 삭제 후 최소 하나 이상의 컬럼이 테이블에 존재해야 한다.
ALTER TABLE PLAYER_TEMP DROP COLUMN ADDRESS;

-- 컬럼명 변경 (RENAME COLUMN)
ALTER TABLE PLAYER_TEMP RENAME COLUMN PLAYER_ID TO PLAYER_NEW_ID;

-- 컬럼의 정의 수정 (MODIFY)
ALTER TABLE PLAYER_TEMP MODIFY (PLAYER_NAME NOT NULL); -- PLAYER_NAME 속성 NOT NULL로 변경
ALTER TABLE PLAYER_TEMP MODIFY (PLAYER_NAME NULL); -- NOT NULL 제약 조건 삭제됨

-- 제약 조건의 추가/삭제
ALTER TABLE PLAYER_TEMP ADD CONSTRAINT PLAYER_TEMP_FK
FOREIGN KEY (TEAM_ID) REFERENCES TEAM(TEAM_ID);

ALTER TABLE PLAYER_TEMP DROP CONSTRAINT PLAYER_TEMP_FK; -- 제약조건 삭제

-- RENAME 문을 통한 테이블 명칭 변경
SELECT * FROM USER_OBJECTS WHERE OBJECT_TYPE = 'TABLE'; -- 테이블 오브젝트 조회
RENAME PLAYER_TEMP TO PLAYER_NEW_TEMP; -- 테이블 명칭 변경

칼럼 정의 수정

- 데이터 타입 변경은 테이블에 아무 행도 없거나 해당 컬럼이 NULL만 갖고 있을 때 가능하다.

- 컬럼 크기 확대는 항상 가능하지만, 컬럼 크기 축소는 테이블에 아무 행도 없거나 해당 컬림이 NULL만 갖고 있거나,

현재 저장된 값을 수용할 수 있는 크기로의 축소만 가능하다.

- DEFAULT 값 추가 및 수정은 이후 삽입되는 행에만 영향을 미친다.

- NOT NULL 제약 조건 추가는 테이블에 아무 행도 없거나 해당 컬럼에 NULL이 없을 때 가능하다.

- NOT NULL 제약 조건 삭제는 항상 가능하다.

 

 

 

 

DROP 문을 통한 테이블 삭제

DROP TABLE TEAM;
DROP TABLE TEAM CASCADE CONSTRAINT; -- 관련된 제약조건을 함께 삭제

 

문제

-- PLAYER_TEMP 테이블에서 PLAYER_NEW_ID를 PK로 지정하라
ALTER TABLE PLAYER_TEMP ADD CONSTARINT player_id_pk PRIMARY KEY (PLAYER_NEW_ID);

-- PLAYER_TEMP 테이블에서 TEAM 테이블의 TEAM_ID를 참조하는 제약조건명이 PLAYER_TEMP_FK 인 컬럼 TEAM_ID를 생성하라
ALTER TABLE PLAYER_TEMP ADD CONSTRAINT PLAYER_TEMP_FK FOREIGN KEY (TEAM_ID) REFERENCES TEAM(TEAM_ID);

'전공 지식 정리 > 데이터베이스 설계' 카테고리의 다른 글

데이터베이스 SQL - Multi-row Function (다중 행 함수)  (0) 2022.11.29
데이터베이스 SQL - Function  (0) 2022.11.28
데이터베이스 SQL문 DML  (0) 2022.10.23
데이터베이스 - 데이터 모델과 성능  (0) 2022.10.22
데이터베이스의 개요  (3) 2022.03.22
'전공 지식 정리/데이터베이스 설계' 카테고리의 다른 글
  • 데이터베이스 SQL - Multi-row Function (다중 행 함수)
  • 데이터베이스 SQL - Function
  • 데이터베이스 SQL문 DML
  • 데이터베이스 - 데이터 모델과 성능
daramG
daramG
dotori Java
daramG
다람쥐의 개발 블로그
daramG
전체
오늘
어제
  • 분류 전체보기 (193)
    • Java 코딩테스트 공부 (67)
      • Java 알고리즘 공부 (37)
      • Java 백준 문제풀이 (27)
      • Java 코테 나만의 팁 (3)
    • SQL Study (0)
      • Programmers SQL 문제풀이 (0)
      • SQLP 준비 (0)
    • 웹 개발 지식 정리 (0)
      • Servlet (0)
      • Java 정리 (0)
    • 자바 스프링 (45)
      • 스프링 공부 (4)
      • 스프링 게시판 프로젝트 (6)
      • 부트 블로그 JPA 프로젝트 (30)
      • react & springboot (5)
      • 스프링 오류창고 (0)
      • 리액트 + 스프링 프로젝트 (0)
      • pf (0)
      • pfError (0)
    • React (6)
      • React 정리 (3)
      • React 오류 창고 (3)
    • C++ 코딩테스트 공부 (중단) (20)
      • c++ 백준 문제풀이 (15)
      • c++ 알고리즘 공부 (5)
    • Unity (3)
      • Unity 공부 (3)
    • WebRTC (2)
      • WebRTC 강의학습 정리 (0)
      • WebRTC 프로젝트 (1)
    • 김영한님의 스프링 강의 학습 (10)
      • 스프링 강의 목차 (1)
      • 인텔리제이 & 스프링 기초 (1)
      • 스프링 핵심 원리 (8)
    • 전공 지식 정리 (40)
      • interview (0)
      • Java (0)
      • 운영체제 (4)
      • 데이터베이스 설계 (10)
      • 소프트웨어 공학 (3)
      • 유닉스 (14)
      • 디지털 논리회로 (0)
      • 인공지능 (7)
      • js (0)
      • etc (2)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • java 알고리즘
  • Unity 공부
  • 스프링 공부
  • 백준 c++
  • 부트 jpa 게시판 프로젝트
  • 인공지능
  • 데이터베이스 설계
  • 스프링 프로젝트
  • 운영체제
  • 디지털 논리회로
  • 김영한 스프링 강의
  • 노마드코더의 zoom클론코딩
  • 코테 알고리즘
  • Java 코테 나만의 팁
  • 김영한 스프링 입문
  • java
  • React&Spring 강의수강
  • C++ 알고리즘
  • 스프링부트 블로그 프로젝트
  • 스프링부트 프로젝트
  • Java 백준 문제풀이
  • 무서운 이야기
  • 유닉스
  • 김영한의 스프링 핵심 원리

최근 댓글

최근 글

hELLO · Designed By 정상우.
daramG
데이터베이스 SQL문 DDL
상단으로

티스토리툴바

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.