본문 바로가기

SQL

[SQL] 트리거 설정, 문자+숫자(ABC0001)로 아이디 주기

반응형

1. SQL 트리거

트리거(Trigger): 데이터베이스에서 특정 테이블에 INSERT, DELETE, UPDATE 같은 DML문이 수행되었을 때, 데이터베이스에서 자동으로 동작하도록 작성된 프로그램.

전체 트랜잭션 작업에 대해 발생되는 트리거와, 각 행에 대해 발생되는 트리거가 있습니다.
 

[SQLD] 제2장 트리거(Trigger)란?

1. 트리거(Trigger)란? 트리거(Trigger)란 영어로 방아쇠라는 뜻인데, 방아쇠를 당기면 그로 인해 총기 내부에서 알아서 일련의 작업을 실행하고 총알이 날아갑니다. 이처럼 데이터베이스에서도 트리

limkydev.tistory.com


2. 트리거 생성 및 설정 방법

DELIMITER $$
CREATE TRIGGER [트리거명]
BEFORE INSERT ON [테이블명]
FOR EACH ROW
BEGIN
  [수행할 동작]
END$$
DELIMITER ;

3. 문자 + 숫자(ABC0001)로 아이디 주기

DELIMITER $$
CREATE TRIGGER tg_table1_insert
BEFORE INSERT ON table1
FOR EACH ROW
BEGIN
  INSERT INTO table1_seq VALUES (NULL);
  SET NEW.id = CONCAT('LHPL', LPAD(LAST_INSERT_ID(), 3, '0'));
END$$
DELIMITER ;
이렇게 하면 LHPL0001, LHPL0002로 아이디가 설정된다.

 

 

How to make MySQL table primary key auto increment with some prefix

I have table like this table id Varchar(45) NOT NULL AUTO_INCREMENT PRIMARY KEY, name CHAR(30) NOT NULL, I want to increment my id field like 'LHPL001','LHPL002','LHPL003'... etc. What should I h...

stackoverflow.com

 

 

[mysql] 문자열과 정수로 된 기본키 자동 증가 구현하기

기본키의 값을 ABC00001와 같이 앞자리는 문자열 뒷자리는 숫자로 하고, 숫자는 자동 증가로 할 때 사용하는 방법입니다. table1_seq 테이블 : 임시 테이블로 기본키만 있으며, 이 테이블의 기본키 값

stajun.tistory.com


4. 다른 테이블의 집계함수 정보 가져와서 필드에 연결

이 내용이 하이라이트이다. 사실 이 내용을 작성하려 앞의 트리거 내용을 기술했던 것이다.

문제. 각 직원은 동호회에 소속될 수 있다. 단, 동호회는 2개까지만 가입 가능하다.

 

어떻게 작성할 수 있을까?
소속이라는 테이블에 레코드가 추가될 때마다, CLUB_COUNT를 추가하고 싶다.
따라서 트리거를 다음과 같이 설정해보았다.

-- EMPLOYEE(EMPLOYEE_NUM, EMPLOYEE_NAME, CLUB_COUNT) -- 직원
-- CLUB(CLUB_NUM, CLUB_NAME, PRESIDENT) -- 동호회
-- BELONG(BELONG_NUM, MEMBER_NUM, CLUB_NUM) -- 동호회 소속

DELIMITER $$
CREATE TRIGGER tg_BELONG_insert
BEFORE INSERT ON BELONG
FOR EACH ROW
BEGIN
	UPDATE EMPLOYEE AS A
	SET A.CLUB_COUNT = (
				SELECT COUNT(B.CLUB_NUM)
				FROM BELONG AS B
				WHERE B.MEMBER_NUM = A.EMPLOYEE_NUM
				GROUP BY B.MEMBER_NUM
			);
END$$
DELIMITER ;

 

BELONG이라는 테이블에, 각 행에 INSERT 동작이 실행될 때마다
UPDATE 구문을 실행해주었다.
이때, EMPLOYEE 테이블의 CLUB_COUNT는 SELECT 하여 집계 함수 구문으로 가지고 왔다.

 

실행 결과는 다음과 같다.

-- EMPLOYEE(EMPLOYEE_NUM, EMPLOYEE_NAME, CLUB_COUNT)
1                 피카츄        1
2                 파이리        2
3                 꼬부기        0

 

트리거를 설정했으니, EMPLOYEE 테이블로 돌아가서 제약조건을 설정하면 된다.
제약조건은 다음과 같이 설정하였다.

CREATE TABLE EMPLOYEE_EJH(
	EMPLOYEE_NUM INT AUTO_INCREMENT PRIMARY KEY
	,EMPLOYEE_NAME VARCHAR(8) NOT NULL
	,CLUB_COUNT INT NOT NULL DEFAULT 0
	,CONSTRAINT C_count CHECK (CLUB_COUNT IN (0, 1, 2))
);
CLUB_COUNT는 NULL이 될 수 없으니 NULL을 제외하고 가능한 값(0, 1, 2)으로 제약 조건을 설정해주었다.

 

반응형

'SQL' 카테고리의 다른 글

[PostgreSQL] DUAL 테이블이란?  (0) 2023.10.04
[SQL] DB 정리 파일 모음  (0) 2023.05.26
[SQL] 11장. DML(SELECT) 활용 - 집계 함수  (0) 2023.04.27
[SQL] 10장. DML(DELETE)  (0) 2023.04.27
[SQL] 9장. DML(UPDATE), 발생하는 오류  (0) 2023.04.27