ํน์ ํ
์ด๋ธ์ INSERT
, DELETE
, UPDATE
๊ฐ์ DML
๋ฌธ์ด ์ํ๋์์ ๋ DB์์ ์๋์ผ๋ก ๋์ํ๋๋ก ์์ฑ๋ ํ๋ก๊ทธ๋จ
๊ทธ๋๊น ์ด๋ค ์ด๋ฒคํธ๊ฐ ๋ฐ์ํ๋ฉด ์๋์ผ๋ก ๋ฌด์ธ๊ฐ ์ํํ๋ค๋ ์๋ฆฌ์ธ๊ฑฐ ๊ฐ๋ค.
ex)
UPDATE study SET grade = grade + 10 ;
์ด ๋ฌธ์ฅ์ด ์คํ๋จ์ผ๋ก ์ฌ๋ฌํ์ด ๋ณ๊ฒฝ๋ ๊ฒฝ์ฐ ํธ๋ฆฌ๊ฑฐ๋ ๋จ ํ๋ฒ๋ง ์คํ
OLD
, NEW
๋ฅผ ํตํด ๊ฐ์ ธ์ฌ ์ ์์๐งท ํธ๋ฆฌ๊ฑฐ ํ์
CREATE [OR REPLACE] TRIGGER ํธ๋ฆฌ๊ฑฐ๋ช
(BEFORE|AFTER) (INSERT|DELETE|UPDATE)
ON ํ
์ด๋ธ๋ช
[FOR EACH ROW]
[WHEN ์กฐ๊ฑด์]
BEGIN
END;
CREATE TRIGGER `latest_activity` AFTER INSERT ON `activity` FOR EACH ROW BEGIN
DECLARE latest TINYINT(1); - (1)
SELECT EXISTS (
SELECT * FROM `cow_activity` WHERE `cow_id` = NEW.cow_id AND `farm_id` = NEW.farm_id AND `type` = NEW.type AND `activity_date` > NEW.activity_date
) INTO `latest`; - (2)
IF `latest` = 0 THEN
INSERT INTO `latest_activity`(`cow_id`, `farm_id`, `activity_date`, `type`, `value`)
VALUES(NEW.cow_id, NEW.farm_id, NEW.activity_date, NEW.type, NEW.value) ON DUPLICATE KEY UPDATE `activity_date` = NEW.activity_date, `value` = NEW.value;
END IF; - (3)
END;
(1) TINYINT ๋ณ์ ์ ์ธ
(2) ์ต๊ทผ์ ๋ค์ด์จ ๋ฐ์ดํฐ๊ฐ ์ด์ ๋ฐ์ดํฐ๋ณด๋ค ๋ ์ง๊ฐ ์ด์ ์ธ ํํ์ด ์๋ค๋ฉด latest ๋ณ์์ 1(true)์ด ๋ค์ด๊ฐ (์ด์ง๊ฐํ๋ฉด ์์ ๋ฆฌ ์์)
(3) ๋ง์ฝ false ๋ผ๋ฉด ์ต๊ทผ์ ๋ค์ด์จ ๋ฐ์ดํฐ๋ฅผ ๋ค๋ฅธ ํ
์ด๋ธ์ INSERT
ํ๋๋ก SQL ๋ฌธ์ ์คํ
2021-10-29 ์ถ๊ฐ
ON DUPLICATE KEY UPDATE `activity_date` = NEW.activity_date, `value` = NEW.value;
ํค๊ฐ ์ค๋ณต๋ ๋ ํค ๊ฐ์ ์ ๋ฐ์ดํธ ํ๊ณ value ์ปฌ๋ผ์ ๊ฐ์ insert ํด์ฃผ๋ ๋ฌธ์ฅ์ธ์ค ์์์ผ๋, ์ค๋ณต๋๋ ํค๊ฐ ์ด๋ฏธ ํ ์ด๋ธ์ ์กด์ฌํ๋ฉด value ์ปฌ๋ผ์ ๊ฐ๋ง ๋ณ๊ฒฝํ ๋ก ํ๋ ๋ฌธ์ฅ์ด์๋ค.
์ด๋ฅผ ํ์ ํ์ง ๋ชปํ๊ณ esle ๋ฌธ์ ์ฌ์ฉํ์ฌ ์กด์ฌํ๋ ์ปฌ๋ผ์ด๋ฉด update ํ๋๋ก ์์ฑํ์๋๋ฐ ๊ทธ๋ด ํ์๊ฐ ์์๋ ๊ฒ.
์ ์ฌ์ค์ ๊นจ๋ซ๊ฒ ํด์ค Trigger ๋ฌธ ๐CREATE DEFINER=`root`@`localhost` TRIGGER `log` AFTER INSERT ON `index_log` FOR EACH ROW BEGIN INSERT INTO `index_logs`(`idx`, `date`, `year`, `half_year`, `month`, `week`, `day`, `total`) VALUE(NEW.idx, STR_TO_DATE(CONCAT(NEW.year, '-', NEW.month, '-', NEW.day), '%Y-%m-%d'), NEW.year, IF(NEW.month < 7, 1, 2), NEW.month, NEW.week, NEW.day, 1) ON DUPLICATE KEY UPDATE `total` = `total` + 1; END;