목차
Trigger
Cursor
Index
Trigger
테이블에 Insert, Update, Delete 작업이 발생하면 자동으로 수행됨
데이터의 무결성을 보장하는 장치의 역할
직접 실행할 수 없음
DELIMITER $$
CREATE TRIGGER 트리거명
trigger_time trigger_event
ON 테이블명 FOR EACH ROW
[trigger_order]
BEGIN
~트리거 코딩부;
END $$
DELIMITER ;
trigger_time : {BEFORE | AFTER}
trigger_event : {INSERT | UPDATE | DELETE}
trigger_order : {FOLLOW | PRECEDES} other_trigger_name
BEFORE trigger
- 테이블에 변경 작업이 일어나기 전에 작동하는 트리거 (변경 작업 전 실행)
AFTER trigger
- 테이블에 변경(삽입, 수정, 삭제) 작업이 일어났을 때 작동하는 트리거 (변경 작업 후 실행)
NEW 테이블과 OLD 테이블
- 트리거에서 변경 작업이 수행되면 임시로 사용되는 시스템 테이블
- OLD: DELETE 로 삭제된 데이터 | UPDATE 로 바뀌기 전의 데이터
- NEW : INSERT 로 삽입된 데이터 | UPDATE 로 바뀐 후의 데이터
EVENT | OLD | NEW |
INSERT | X | O |
UPDATE | O | O |
DELETE | O | X |
Trigger의 활용 1
변경되기 전 데이터를 저장할 백업 테이블을 생성하고
CREATE TABLE backup_DEPT(
DEPTNO INT(10),
DNAME VARCHAR(14),
LOC VARCHAR(13),
modType CHAR(4), -> 변경 유형 (수정 OR 삭제)
modDate DATE); -> 변경 날짜
- 데이터를 수정했을 때 작동하는 dept_up_trg 트리거를 작성해보자
DELIMITER $$
CREATE TRIGGER dept_up_trg
AFTER UPDATE
ON DEPT
FOR EACH ROW
BEGIN
INSERT INTO backup_DEPT VALUES(OLD.DEPTNO, OLD.DNAME. OLD.LOC, '수정', CURDATE());
END $$
DELIMITER ;
Trigger의 활용 2
- 데이터를 삭제했을 때 작동하는 dept_del_trg 트리거를 작성해보자
DELIMITER $$
CREATE TRIGGER dept_del_trg
AFTER DELETE
ON DEPT
FOR EACH ROW
BEGIN
INSERT INTO backup_DEPT VALUES (OLD.DEPTNO, OLD.DNAME, OLD.LOC, '삭제', CURDATE());
END $$
DELIMITER ;
Trigger의 활용 1,2 확인
UPDATE DEPT
SET DNAME='PLANNING'
WHERE DEPTNO=40;
DELETE FROM DEPT
WHERE DEPTNO=40;
SELECT * FROM DEPT;
SELECT * FROM backup_DEPT;
Trigger의 활용 3
- 데이터를 삽입하기 전 작동하는 sal_in_trg 트리거
DELIMITER $$
CREATE TRIGGER sal_in_trg
BEFORE INSERT
ON DEPT
FOR EACH ROW
BEGIN
IF NEW.sal<800 THEN
SET NEW.sal=0;
ELSEIF NEW.sal>4500 THEN
SET NEW.sal=4500;
END IF;
END $$
DELIMITER ;
생성된 트리거 확인
SHOW TRIGGERS FROM 데이터베이스명;
트리거 삭제
DROP TRIGGER 트리거명;
Cursor (커서)
프로시저 내부에서 복수 행을 처리할 때 사용하는 구성요소
파일 포인터가 열린 파일에서의 현재 위치를 표시하는 것처럼 커서는 결과 집합에서 현재 위치를 표시
- 쿼리의 결과 행 집합에서 한 행씩 옮겨가며 명령을 처리함
- OPEN, FETCH, CLOSE 문을 사용하여 커서를 제어
커서의 작동 순서
- 커서 선언 (DELCARE)
- 반복 조건 선언 (DECLARE ... HANDLER)
- 커서 열기 (OPEN0
- 커서에서 데이터 가져오기 (FETCH)
- 데이터 처리
- 커서 닫기 (CLOSE)
Cursor 의 활용
DELIMITER $$
CREATE PROCEDURE info_hiredate(IN p_year CHAR(5))
BEGIN
DECLARE cnt INT DEFUALT 0;
DECLARE empName VARCHAR(10);
DECLARE endOfRow BOOLEAN DEFAULT FALSE; #행의 끝 여부
DECLARE userCursor CURSOR FOR
SELECT ename
FROM emp
WHERE YEAR(HIREDATE)=p_year;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET endOfRow=TRUE; #행의 끝일 때 Handler 정의
OPEN userCursor;
cloop: WHILE TRUE DO
FETCH userCursor INTO empName; #읽은 행 empName에 대입
IF endOfRow THEN #더이상 읽을 행이 없으면 반복문 종료
LEAVE cloop;
END IF;
SET cnt=cnt+1;
SELECT CONCAT(cnt,'번','empName);
END WHILE;
CLOSE userCursor;
END $4
DELIMITER ;
CALL info_hiredate('1982');
Index
SQL 명령문의 처리 속도를 향상시키기 위해 특정 컬럼에 대해 생성하는 개체
- 데이터 검색시 데이터에 빠르게 접근할 수 있도록 함
- 테이블에 저장된 데이터를 액세스하기 위한 목적으로 사용
- MySQL에서는 클러스터형 인덱스와 보조 인덱스로 구분
- INSERT, UPDATE의 속도가 저하되는 단점이 있음
인덱스의 구분
(클러스터형 / 비클러스터형)
클러스터형 인덱스 | 보조 인덱스 (비클러스터형 인덱스) |
- 내용 자체가 순서대로 정렬되어 있는 책과 같음 - 테이블당 하나만 생성할 수 있음 |
- 찾아보기가 별도로 있어 찾아보기로 페이지를 확인 후 내용을 확인하는 책과 같음 |
자동으로 생성되는 인덱스
테이블 생성시 기본키를 설정하면 자동으로 기본키 열에 클러스터형 인덱스가 생성된다
특징
- 테이블을 생성할 때 특정 열을 기본키로 생성하면 클러스터형 인덱스가,
- UNIQUE 제약 조건을 설정하면 그 열에 자동으로 보조 인덱스가 생성된다.
보조 INDEX 생성
UNIQUE : 고유 인덱스 지정
ASC | DESC : 인덱스 키를 오름차순 또는 내림차순으로 정렬
CREATE [UNIQUE] INDEX 인덱스명 ON 테이블명(컬럼명 [ASC|DESC],...)
고유 인덱스
유일한 값을 가지는 컬럼에 대해 생성하는 인덱스로 모든 인덱스 키는 테이블의 하나의 행과 연결
CREATE UNIQUE INDEX idx_dept_dname ON dept(dname);
비고유 인덱스
중복된 값을 가지는 컬럼에 대해 생성하는 인덱스
CREATE INDEX idx_emp_hdate ON emp(hiredate);
단일 인덱스
하나의 컬럼으로만 구성된 인덱스
결합 인덱스
두 개 이상의 컬럼을 결합하여 생성하는 인덱스
CREATE INDEX emp_job_deptno ON emp(job,deptno);
생성된 인덱스 확인
SHOW INDEX FROM 테이블명;
인덱스 삭제
DROP INDEX 인덱스명 ON 테이블명;
'Computer Study' 카테고리의 다른 글
[Database] 데이터 모델링 (0) | 2023.12.12 |
---|---|
[Database] 데이터베이스 보안과 권한 관리 (0) | 2023.12.12 |
[MySQL] Stored Procedure, Stored Function 이론 및 예제 (0) | 2023.12.11 |
[MySQL] 테이블 변경 및 제약조건 (0) | 2023.12.11 |
[Computer Networks] Error Detection - Parity bit, Checksum, CRC (1) | 2023.10.18 |