SQL - MySQL, Event & Trigger

2026. 3. 31. 11:06ยท๐Ÿงฉ SQL

MySQL

 

 

โœ… Event & Trigger


Event

MySQL์—์„œ ๊ธฐ๋ณธ์ ์œผ๋กœ ์ œ๊ณตํ•˜๋Š” ๊ธฐ๋Šฅ

Database๊ฐ€ ํ•ด์•ผ ํ•  ์ž‘์—…๋“ค์„ ์Šค์ผ€์ค„๋ง ํ•  ์ˆ˜ ์žˆ๋‹ค.

ex) ํŠน์ • ์กฐ๊ฑด์— ํ•ด๋‹น๋˜๋Š” row๋“ค์„ ๋งค์ฃผ ์ˆ˜์š”์ผ ์˜คํ›„ 3์‹œ์— ์‚ญ์ œํ•œ๋‹ค.

 

PostgreSQL์—์„œ๋„ ์ง€์›ํ•˜์ง€๋งŒ ํ™•์žฅํ”„๋กœ๊ทธ๋žจ์„ ์ด์šฉํ•ด์•ผ ํ•œ๋‹ค.

SQLite์—์„œ๋Š” ์‚ฌ์šฉ์ด ๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค.

 

 

Trigger

Database์—์„œ ์ผ์–ด๋‚˜๋Š” ์ผ์— ๋ฐ˜์‘ํ•  ์ˆ˜ ์žˆ๋‹ค.

ex) ๋ˆ„๊ตฐ๊ฐ€๊ฐ€ row๋ฅผ ์‚ญ์ œํ•˜๊ธฐ ์ „์— ๊ทธ ์‚ญ์ œ์— ๋Œ€ํ•œ log๋ฅผ log ํ…Œ์ด๋ธ”์— ๋งŒ๋“ ๋‹ค.

 

MySQL, PostgreSQL, SQLite ๋ชจ๋‘ ์‚ฌ์šฉ ๊ฐ€๋Šฅ

 

๋ฐ์ดํ„ฐ ์—†์ด ๊ตฌ์กฐ๋งŒ ๊ทธ๋Œ€๋กœ ๊ฐ€์ ธ์™€ ํ…Œ์ด๋ธ”์„ ์ƒ์„ฑํ•˜๋Š” ๋ฒ•

CREATE TABLE archived_movies LIKE movies;

 

 

 

โœ… Event


• ๊ด€๋ฆฌ
โ–ซ ์ด๋ฒคํŠธ๋ฅผ ๋ณด๋ ค๋ฉด: ‎`SHOW EVENTS;`
โ–ซ ์ด๋ฒคํŠธ๋ฅผ ์‚ญ์ œํ•˜๋ ค๋ฉด: ‎`DROP EVENT ์ด๋ฒคํŠธ์ด๋ฆ„;`
โ–ซ ์ด๋ฒคํŠธ ์Šค์ผ€์ค„๋Ÿฌ๊ฐ€ ์ผœ์ ธ ์žˆ์–ด์•ผ ๋™์ž‘ํ•ฉ๋‹ˆ๋‹ค: SET GLOBAL event_scheduler = ON;

 

Event ์ƒ์„ฑ

CREATE EVENT archived_old_movies ON schedule EVERY 2 DAY;

DAY ๋ถ€๋ถ„์—๋Š” MINUTE, WEEK, YEAR, MONTH ๋“ฑ ๋‹ค์–‘ํ•˜๊ฒŒ ๋“ค์–ด๊ฐˆ ์ˆ˜ ์žˆ๋‹ค.

CREATE EVENT archived_old_movies ON schedule EVERY 2 MINUTE DO
INSERT INTO
	archived_movies
SELECT
	*
FROM
	movies
WHERE
	release_date < YEAR(CURDATE()) - 20;

20๋…„ ์ „ ์˜ํ™”๋“ค๋งŒ ๊ณจ๋ผ์„œ 2๋ถ„๋งˆ๋‹ค archived_movies TABLE์— ๋„ฃ๊ธฐ

 

Table์„ DROP ์‹œํ‚ค์ง€ ์•Š๊ณ  ๋‚ด์šฉ๋งŒ ์ „๋ถ€ ์ง€์šฐ๋Š” ๋ฐฉ๋ฒ•(TRUNCATE)

TRUNCATE TABLE archived_movies;

 

Event ๋‚ด์—์„œ statement๊ฐ€ 2๊ฐœ ์ด์ƒ์ด๋ฉด BEGIN๊ณผ END๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค

CREATE EVENT archived_old_movies ON SCHEDULE EVERY 2 MINUTE starts CURRENT_TIMESTAMP + INTERVAL 2 MINUTE DO BEGIN
INSERT INTO
	archived_movies
SELECT
	*
FROM
	movies
WHERE
	release_date < YEAR(CURDATE()) - 20;

DELETE FROM movies
WHERE
	release_date < YEAR(CURDATE()) - 20;

END;

 DO๋งŒ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์€ ์˜ค์ง statement๊ฐ€ 1๊ฐœ์ผ ๋•Œ.

๊ทธ๋Ÿฐ๋ฐ ์œ„ ์ฝ”๋“œ๋Š” ์ •์ƒ ๋™์ž‘์ด ๋˜์ง€ ์•Š๋Š”๋‹ค.

EVENT ๋‚ด์—์„œ ์ฒซ ๋ฒˆ์งธ WHERE ์ ˆ๊นŒ์ง€๊ฐ€ ํ•˜๋‚˜์˜ ๋ช…๋ น์–ด๋กœ ๋ณด๊ธฐ ๋•Œ๋ฌธ.

 

 

Delimiter

Database์—๊ฒŒ SQL statement๊ฐ€ ๋๋‚ฌ๋‹ค๊ณ  ์•Œ๋ ค์ฃผ๋Š” ๋ฌธ์ž(;)

์œ„ ์ฝ”๋“œ๋ฅผ ๋ณด๋ฉด BEGIN, END ๋ธ”๋ก ๋‚ด์— delimiter๊ฐ€ 2๊ฐœ๋ผ์„œ SQL์ด ํ—ท๊ฐˆ๋ คํ•œ๋‹ค.

DELIMITER $$
CREATE EVENT archived_old_movies ON SCHEDULE EVERY 2 MINUTE starts CURRENT_TIMESTAMP + INTERVAL 2 MINUTE DO BEGIN
INSERT INTO
	archived_movies
SELECT
	*
FROM
	movies
WHERE
	release_date < YEAR(CURDATE()) - 20;

DELETE FROM movies
WHERE
	release_date < YEAR(CURDATE()) - 20;

END$$
DELIMITER ;

DELIMITER ํ‚ค์›Œ๋“œ๋กœ $$๋ฅผ DELIMITER๋กœ ์‚ฌ์šฉํ•œ๋‹ค๊ณ  ์ง€์ •ํ•˜๊ณ , END๋ถ€๋ถ„์—์„œ ์‚ฌ์šฉํ•œ ๋’ค ๋‹ค์‹œ ;๋กœ DELIMITER๋ฅผ ๋ฐ”๊พผ๋‹ค.

DELIMITER๋กœ ์ง€์ •ํ•œ delimiter๋Š” EVENT ๋‚ด๋ถ€๊ฐ€ ์•„๋‹Œ ์™ธ๋ถ€์— ์ ์šฉ๋œ๋‹ค.

 

 

Event Scheduling Options

https://chatgpt.com/share/d5844020-c1d8-46d9-a363-879f3421750f

 

 

โœ… Trigger


Trigger์—๋Š” 2์ข…๋ฅ˜๊ฐ€ ์žˆ๋‹ค.

1. Before Trigger

2. After Trigger

 

Trigger ์ƒ์„ฑํ•˜๋Š” ๋ฒ•

CREATE TRIGGER before_movie_insert BEFORE
INSERT
	ON movies FOR EACH ROW
INSERT INTO
	records (changes)
VALUES
	(CONCAT('Will insert', NEW.title));

movies table์˜ ๋ชจ๋“  row์— ๋Œ€ํ•˜์—ฌ insert๊ฐ€ ์ผ์–ด๋‚˜๊ธฐ ์ „์— ์ƒˆ๋กœ insert๋˜๋Š” movie data์˜ title์„ rocords table์˜ changes column์— insertํ•œ๋‹ค.

 

NEW, OLD

insertํ•  ๋•Œ NEW.title์ฒ˜๋Ÿผ NEW๋กœ ์ƒˆ๋กœ ์ถ”๊ฐ€ ๋  ๋ฐ์ดํ„ฐ๋ฅผ ์ฐธ์กฐํ•  ์ˆ˜ ์žˆ๊ณ ,

updateํ•  ๋•Œ๋Š” OLD.title์ฒ˜๋Ÿผ OLD๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์—…๋ฐ์ดํŠธ ๋˜๊ธฐ ์ „ ๊ธฐ์กด ๋ฐ์ดํ„ฐ๋ฅผ ์ฐธ์กฐํ•  ์ˆ˜ ์žˆ๋‹ค.

CREATE TABLE records (record_id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY, changes TINYTEXT, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP NOT NULL);

CREATE TRIGGER before_movie_delete BEFORE
DELETE ON movies FOR EACH ROW
INSERT INTO
	records (changes)
VALUES
	(CONCAT('Will delete: ', OLD.title));

CREATE TRIGGER after_movie_delete AFTER DELETE ON movies FOR EACH ROW
INSERT INTO
	records (changes)
VALUES
	(CONCAT('Bye Bye: ', OLD.title));

INSERT INTO
	movies
SELECT
	*
FROM
	archived_movies
WHERE
	movie_id = 2;

 

 

Trigger๋ฅผ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด์ฒ˜๋Ÿผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

DELIMITER $$
CREATE TRIGGER after_movie_update
AFTER UPDATE
ON movies
FOR EACH ROW
BEGIN
	DECLARE changes TINYTEXT DEFAULT '';
	IF NEW.title <> OLD.title THEN SET changes = CONCAT('Title changed ', OLD.title, '->', NEW.title, '\n');
	END IF;

	IF NEW.budget <> OLD.budget THEN SET changes = CONCAT(changes, 'Budget changed ', OLD.budget, '->', NEW.budget);
	END IF;

	INSERT INTO records (changes) VALUES (changes);
END$$
DELIMITER ;

TRUNCATE TABLE records;
DROP TRIGGER after_movie_update;

DECLARE๋Š” ๋ณ€์ˆ˜ ์„ ์–ธ ํ‚ค์›Œ๋“œ

<>๋Š” != ์˜ ํ‘œ์ค€ SQL ํ‘œํ˜„์ด๋‹ค.

!= ๋Š” ์ผ๋ถ€ DBMS์—์„œ ์ง€์›

'๐Ÿงฉ SQL' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

SQL - PostgreSQL ์„ค์น˜(๊ณต์‹ ์‚ฌ์ดํŠธ, Homebrew)  (0) 2026.04.01
SQL - MySQL, Full Text Index  (0) 2026.03.31
SQL - MySQL, UNION  (0) 2026.03.27
SQL - MySQL, ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ •๊ทœํ™”, Foreign Key, JOIN  (0) 2026.03.25
SQL - MySQL, ๋ฌธ๋ฒ•  (0) 2026.03.24
'๐Ÿงฉ SQL' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€
  • SQL - PostgreSQL ์„ค์น˜(๊ณต์‹ ์‚ฌ์ดํŠธ, Homebrew)
  • SQL - MySQL, Full Text Index
  • SQL - MySQL, UNION
  • SQL - MySQL, ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ •๊ทœํ™”, Foreign Key, JOIN
j2yonghwa
j2yonghwa
Trying to be a fullstack developer ๐Ÿš€
  • j2yonghwa
    j2yonghwa
    j2yonghwa
  • ์ „์ฒด
    ์˜ค๋Š˜
    ์–ด์ œ
    • ๋ถ„๋ฅ˜ ์ „์ฒด๋ณด๊ธฐ (156)
      • โฐ Daily WakaTime (1)
      • ๐Ÿ–๏ธ ๋…ธ๋งˆ๋“œ์ฝ”๋” (2)
      • ๐Ÿบ Dev Setup (3)
      • ๐Ÿ”ญ Tech Info (1)
      • ๐Ÿšซ Error (1)
      • ๐Ÿ“‚ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ (23)
      • ♣๏ธ Next.js 14 (10)
      • ♠๏ธ Next.js 12 (20)
      • ๐Ÿ›ธ React Native (12)
      • ๐Ÿฆ‹ TypeScript (1)
      • ๐Ÿ Python (2)
      • ๐ŸŒŠ TailwindCSS (4)
      • ๐Ÿงฉ SQL (25)
      • ๐Ÿ’Ž Prisma (5)
      • ๐ŸŒฑ MongoDB (4)
      • ๐ŸŽฏ Redis (1)
      • ๐Ÿงฌ GraphQL (2)
      • ๐Ÿ”ฅ Firebase (7)
      • ๐Ÿ’ธ Third-Party Services (2)
      • ๐Ÿ•ธ๏ธ Web (1)
      • ๐Ÿ† ์ฝ”๋”ฉํ…Œ์ŠคํŠธ (23)
      • ๐Ÿ“™ ๋ชจ๋”ฅ๋‹ค (5)
      • ๐Ÿ“— ์ฝ”ํ…Œ ํ•ฉ๊ฒฉ์ž ๋˜๊ธฐ -JS- (0)
      • ๐Ÿ“˜ ํด๋ฆฐ์ฝ”๋“œ (0)
      • ๐Ÿฏ ๊ฟ€ํŒ ๐Ÿ (1)
  • ๋ธ”๋กœ๊ทธ ๋ฉ”๋‰ด

    • ํ™ˆ
    • ํƒœ๊ทธ
    • ๋ฐฉ๋ช…๋ก
  • ๋งํฌ

    • ๊นƒํ—™
  • ๊ณต์ง€์‚ฌํ•ญ

  • ์ธ๊ธฐ ๊ธ€

  • ํƒœ๊ทธ

    Prisma
    SQL
    ๋ชจ๋”ฅ๋‹ค
    React Native
    react router
    Next.js
    next.js 14
    next.js 12
    MySQL
    API
    ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ
    0๋ ˆ๋ฒจ
    Firebase
    tailwindcss
    ์ฝ”๋”ฉํ…Œ์ŠคํŠธ ์ž…๋ฌธ
    ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ
    dev setup
    Python
    PostgreSQL
    mongoDB
  • ์ตœ๊ทผ ๋Œ“๊ธ€

  • ์ตœ๊ทผ ๊ธ€

  • hELLOยท Designed By์ •์ƒ์šฐ.v4.10.3
j2yonghwa
SQL - MySQL, Event & Trigger
์ƒ๋‹จ์œผ๋กœ

ํ‹ฐ์Šคํ† ๋ฆฌํˆด๋ฐ”