1) 정의
관계형 데이터 베이스를 구성하는 기본 데이터 구조로서 행과 컬럼(열)의 구조를 가지는 저장공간이며 각 컬럼은 데이터 타입을 가지고 있다.
2) 특징
- 테이블 이름, 모든 컬럼의 이름 및 타입을 지정함으로 생성
- 컬럼 타입은 표준 SQL 타입 int, smallint, real, double, precision, char(N), varchar(N), date, time, timestamp, interval, 일반 유틸리티의 기타 타입, 여러가지 기하학적 타입 집합을 지원.
- 테이블에서 데이터를 검색하기 위해 질의(SQL)을 사용함
- 데이터 검색을 위한 SELECT, 등록을 위한 INSERT, 수정을 위한 UPDATE, 삭제를 위한 DELETE 명령을 사용함
- 복수의 테이블을 한 번에 액세스 하거나 동일 테이블을 엑세스 하는 방법으로 테이블간 조인을 지원함
- 집계 함수 count, sum, avg, max, min 등을 지원함
3) 생성
CREATE TABLE user_info (
user_id varchar(30)
);
user_info : 테이블명
user_id : 컬럼
varchar : 데이터 타입
30 : 사이즈
4) 기본값
데이터 값을 입력하지 않는 경우 자동으로 입력되는 기본값을 말한다.
CREATE TABLE user_info (
user_id varchar(32) not null,
sso_use_yn char(1) default 'N'
);
5) 제약조건
입력하는 데이터에 대한 제약, 즉 데이터 무결성을 지키기 위한 조건을 의미한다.
가. CHECK 제약 조건
- 컬럼의 값이 Boolean(진리값) 표현식을 만족해야 함.
- 제약 조건에 개별 이름을 부여할 수 있으며 CONSTRAINT 뒤에 식별자, 그 뒤에 제약 조건을 정의
CREATE TABLE user_info (
user_id varchar(32) not null,
age smallint CHECK(age > 0),
height smallint CONSTRAINT positive_height CHECK (height > 0)
);
나. NOT NULL 제약 조건
- 컬럼 값이 null 값이 아님을 체크
CREATE TABLE user_info (
user_id varchar(32) not null
);
다. UNIQUE 제약 조건
- 컬럼 또는 컬럼 그룹에 포함된 데이터가 테이블의 모든 행에서 중복되는 데이터가 없어야 함
- 컬럼 또는 컬럼 그룹에 자동으로 고유 btree 인덱스가 생성됨
- null 값은 중복 저장 허용
* 컬럼에 제약 조건을 사용하는 경우
CREATE TABLE user_info (
user_id varchar(32) UNIQUE
);
* 테이블에 제약 조건을 사용하는 경우
CREATE TABLE user_info (
user_id varchar(32),
user_name varchar(60),
UNIQUE(user_id)
);
* 컬럼 그룹에 제약 조건을 사용하는 경우
CREATE TABLE user_info (
user_id varchar(32),
user_name varchar(60),
social_number int,
UNIQUE(user_name, social_number)
);
라. 기본 키
- 일반적으로 테이블의 각 행은 고유하게 식별되는 값을 가진 컬럼 또는 컬럼의 조합을 가지고 있으며 이를 기본키라 한다.
- 기본키(PRIMARY KEY) 제약 조건은 UNIQUE 제약 조건과 NOT NULL 제약 조건의 조합
- 테이블은 보통 1개의 기본키를 가질 수 있음
CREATE TABLE user_info (
user_id varchar(32),
PRIMARY KEY(user_id)
);
바. 외래 키
- 두 테이블 간의 관계를 설정하고 강제 적용하여 외래 키 테이블에 저장 되는 데이터를 제어 하는데 사용 됨
- 한 테이블이 기본 키 값을 가지고 있는 컬럼을 다른 테이블의 컬럼이 참조할 때 두 테이블 간의 관계가 생성되고 이때 두번째 테이블에 추가되는 컬럼을 외래키라고 함.
- 1개 이상의 외래 키를 가질 수 있으며 참조되는 컬럼의 수 및 타입은 일치해야 함
- 제한 및 케스케이딩 삭제는 두가지 가장 일반적인 옵션이며 RESTICT 는 참조되는 행의 삭제를 금지하며 CASCADE는 참조되는 행이 삭제될 경우 참조하는 행도 자동으로 삭제되는지를 지정함
* 게시물을 저장하는 board 와 게시물 comment 저장하는 board_comment 테이블
CREATE TABLE board (
board_id bigint,
title varchar(256) NOT NULL,
PRIMARY KEY(board_id)
);
CREATE TABLE board_comment (
board_comment_id bigint,
board_id bigint,
contents text NOT NULL,
.... 생략 ....
FOREIGN KEY(board_id) REFERENCES board(board_id)
);
* RESTICT 옵션
CREATE TABLE board_comment (
board_comment_id bigint,
board_id bigint REFERENCES board ON DELETE RESTRICT
... 생략...
);
* CASCADE 옵션
CREATE TABLE board_comment (
board_comment_id bigint,
board_id bigint REFERENCES board ON DELETE CASCADE
... 생략...
);
사. 제외 제약 조건
- 생략( 잘 모르겠음... .베끼기는 싫고)
6) 시스템 컬럼
- 모든 테이블에는 시스템에서 암시적으로 정의하는 몇 개의 시스템 컬럼이 있으며 이러한 이름은 사용자 정의 컬럼으로 사용할 수 없음. 존재 한다는 사실 정도만 알면 될거 같음
- oid(행의 개체 식별자), tableoid, xmin, cmin, xmax, cmax, ctid 등이 있음
7) 테이블 수정
- 처음 생성한 테이블을 시스템 운영 혹은 업무적인 요구 사항에 의해 컬럼을 추가/삭제, 이름, 데이터 타입, 제약 조건등을 추가/삭제 하는 것을 말함
가. 컬럼 추가
새 컬럼을 추가하는 명령어
ALTER TABLE user_info ADD COLUMN hobby varchar(64);
나. 컬럼 삭제
- 필요 없는 컬럼을 삭제할 수 있으며 컬럼에 데이터가 있거나 없거나 삭제됨
- 컬럼의 제약 조건 역시 삭제되나 다른 테이블의 외래 키 제약 조건이 참조하는 경우 자동으로 삭제되지 않으며 CASCADE를 이용하여 삭제할 수 있음
ALTER TABLE user_info DROP COLULM hobby [CASCADE : 강제 삭제 옵션 ];
다. 제약 조건 추가
제약 조건을 추가하기 위해 테이블 제약 조건이 사용됨
ALTER TABLE user_info ADD CONSTRAINT uk_email UNIQUE (email); // uk_email은 제약조건 이름
ALTER TABLE user_info ADD FOREIGN KEY (user_group_id) REFERENCES user_group; // user_group 의 user_group_id를 참조
라. 제약 조건 삭제
제약 조건을 삭제 하려면 이름을 알아야 함
ALTER TABLE user_info DROP CONSTRAINT uk_email; // uk_email은 제약조건 이름
마. 컬럼 기본값 변경
- 기존에 들어 있는 데이터에는 영향을 미치지 않으며, 기본값 변경 적용 이후의 INSERT 명령에 대한 기본값만 변경함
ALTER TABLE user_info ALTER COLUMN sso_use_yn SET DEFAULT 'N';
바. 컬럼 데이터 타입 변경
- 기존에 들어 있는 데이터를 암시적 형변환에 의해 새 타입으로 변환할 수 있는 경우에만 성공함. 복잡한 변환이 필요한 경우에는 USING 절을 추가하여 변경할 수 있음.
사. 컬럼 이름 변경
테이블의 컬럼 이름을 변경
ALTER TABLE user_info RENAME COLUMN phone TO mobile_phone;
아. 테이블 이름 변경
테이블명을 변경
ALTER TABLE board_file RENAME TO board_attach_file;
1) 정의
- 테이블과 관련된 이벤트가 발생할 때마다 자동으로 호출되는 함수.
- INSERT, UPDATE, DELETE 이 실행되는 시점 전 또는 후 또는 TRUNCATE 시 실행 됨.
- 테이블에 바인딩하는 특별한 사용자 정의 함수
- 새 트리거를 생성하는 경우 트리거 함수를 먼저 정의 한 후, 트리거 함수를 테이블에 바인딩 함
- 트리거와 사용자 정의 함수의 차이점은 이벤트가 발생할때마다 트리거가 자동으로 호출 된다는 점.
2) 유형
Row and Statement Level 2가지 유형의 트리거를 제공하며, 이 두가지 유형의 차이점은 트리거가 호출된 횟수와 시간
Row Level 트리거는 10 Row 에 영향을 주는 UPDATE 문을 실행하면 Row Level 트리거가 10회 호출되지만 Statement Level
트리거는 한번만 호출됨
3) 특징
이벤트 전 또는 후에 호출됨. 이벤트 이전에 호출되면 현재 행에 대한 작업을 건너 띄거나 업데이터 가능.
이벤트 후에 호출 된 경우는 모든 변경 사항을 트리거에서 사용할 수 있음
4) 생성
- CREATE FUNCTION 문을 사용해서 trigger function을 생성
CREATE FUNCTION trigger_function() RETURN trigger AS
- CREATE TRIGGER 문을 사용해서 trigger function을 테이블에 바인딩
CREATE TRIGGER trigger_name {BEFORE | AFTER | INSTEAD OF} {event [OR ...]}
ON table_name
[FOR [EACH] {ROW | STATEMENT}]
EXECUTE PROCEDURE trigger_function
가. 로깅을 하는 access_log 테이블을 상속하는 access_log_2017, access_log_2018 이 있다고 가정.
* access_log 는 부모 테이블, access_log_2017, access_log_2018 은 파티션
create table access_log(
access_log_id bigint not null,
user_id varchar(32) not null,
user_name varchar(64) not null,
insert_date timestamp without time zone default now(),
constraint access_log_pk primary key (access_log_id)
);
create table access_log_2017 (
check ( insert_date >= to_timestamp('20170101000000000000', 'YYYYMMDDHH24MISSUS')
and insert_date < to_timestamp('20170101000000000000', 'YYYYMMDDHH24MISSUS') )
) inherits (access_log);
create table access_log_2018 (
check ( insert_date >= to_timestamp('20180101000000000000', 'YYYYMMDDHH24MISSUS')
and insert_date <= to_timestamp('20180101000000000000', 'YYYYMMDDHH24MISSUS') )
) inherits (access_log);
나. 데이터가 들어올때마다 데이터를 등록일을 체크해서 해당 년도 테이블에 insert 하는 function을 생성
CREATE OR REPLACE FUNCTION access_log_insert()
RETURNS TRIGGER AS $$
BEGIN
IF( NEW.insert_date >= to_timestamp('20170101000000000000', 'YYYYMMDDHH24MISSUS')
and NEW.insert_date <= to_timestamp('20180101000000000000', 'YYYYMMDDHH24MISSUS') ) THEN
insert into access_log_2017 values (NEW.*);
ELSIF( NEW.insert_date >= to_timestamp('20180101000000000000', 'YYYYMMDDHH24MISSUS')
and NEW.insert_date <= to_timestamp('20190101000000000000', 'YYYYMMDDHH24MISSUS') ) THEN
insert into access_log_2018 values (NEW.*);
ELSE
RAISE EXCEPTION 'Error in access_log_insert() : data out of range';
END IF;
RETURN NULL;
END;
$$
LANGUAGE PLPGSQL;
다. trigger function을 테이블에 바인딩
create trigger access_log_insert_trigger
before insert on access_log
for each row execute procedure access_log_insert();
5) 수정
ALTER TRIGGER 문을 이용해서 수정
ALTER TRIGGER trigger_name ON table_name RENAME TO new_name;
6) 삭제
DROP TRIGGER를 이용하여 삭제
DROP TRIGGER [IF EXISTS] trigger_name ON table_name;
CREATE RULE is a PostgreSQL language extension, as is the entire query rewrite system.
테이블이나 뷰에 적용되는 새 규칙을 적용 하거나 기존 규칙을 대체
테이블에서 INSERT, UPDATE, DELETE 문 수행 시 실행될 작업을 정의.
일반적으로 규칙은 테이블에 SQL 문이 실행될 때 추가 명령을 실행하게 됨.
INSTEAD 규칙은 주어진 명령을 다른 명령으로 대체하거나 명령이 실행되지 않도록 명령 실행이 시작되기 전에 수행
각행에 독립적으로 실행되는 작업을 원한다면 트리거를 권장.
------------------ 작성 중 ----------
룰 시스템 (보다 정확하게 말하면 쿼리 재 작성 룰 시스템)은 저장 프로 시저 및 트리거와 완전히 다릅니다. 규칙을 고려하여 쿼리를 수정 한 다음 수정 된 쿼리를 계획 및 실행을 위해 쿼리 계획자에게 전달합니다. 이는 매우 강력하며 쿼리 언어 프로 시저, 뷰 및 버전과 같은 많은 요소에 사용할 수 있습니다. 이 규칙 시스템의 이론적 토대와 힘은 데이터베이스 시스템의 제작 규칙을 사용하여 데이터베이스 시스템의 규칙, 절차, 캐싱 및 뷰 및 버전 모델링을위한 통합 프레임 워크에서도 논의됩니다.
38장을......................... 번역하고 작성해야 함.