微軟已移除載點,只好自己備份。
MySQL trigger 介紹
最近在研究 DBMS 的 trigger,不同 DBMS 的 trigger 的功能上差異不小,這裡僅對 MySQL 的 trigger 做筆記。
trigger 的意思同詞一樣,設計目的是讓 DB 的特定事件發生以後,去執行指定的動作。例如某 table 新增了一筆資料以後,將該筆資料記錄到另一個 table。
這次先使用「當使用者註冊成功以後,在 audit log 留下使用者 ID 和註冊的時間。先來建立 users 和 user_audit_log 這二個 table:
CREATE TABLE `users` (
`id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
`user_name` VARCHAR(200) NOT NULL,
`mail` varchar(255) NOT NULL
);
CREATE TABLE `user_audit_log` (
`id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
`user_name` VARCHAR(200) NOT NULL,
`updated_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP()
);
然後來看一下 trigger 的 語法,trigger 可以針對 insert / update / delete 這幾個動作作出反應,另外也可以將 trigger 的動作放在以上幾個動作的之前 BEFORE 與之後 AFTER 執行,也就是說總共有以下這 6 種 trigger:
DOOM CAPTCHA – 玩毀滅公爵才能過關的圖形驗證碼
自從 OCR 技術越來越精準後,文字類型的驗證碼 (CAPTCHA) 和圖形類的驗證碼就越來越容易被電腦辨識出來,反而真人進行辨識的時間有時還比電腦要長。
剛看到別人轉的訊息,有人把毀滅公爵做進的驗證碼中,被驗證者必須殺掉怪物才會被識別成真人:

試玩後發現 DOOM CAPTCHA 有一定的 pattern,再來就是怪物長的都一模一樣。其實這種規律和圖形,專為遊戲設計的辨識工具,辨識速度會比人還要快 …. XD
MySQL 中 UPSERT (update or insert) 的語法
MySQL 中要使用 IF ... ELSE 挺麻煩的,如果要在 insert 失敗 (資料已存在) 以後改對資料做 update 的話,可以考慮使用 INSERT .... ON DUPLICATE KEY。
假設要在 user 的 table 中,新增 user_id 和 mail:
INSERT INTO `user` (
`user_id`,
`mail`
) VALUES (
"zero",
"zero@zeroplex.tw"
)
當 user_id 是 unique index 時,上面的語法會失敗:duplicated key。
這時可以使用 MySQL 中的 INSERT … ON DUPLICATE KEY 語法,來讓 MySQL 自動判斷要使用 INSERT 還是 UPDATE:
INSERT INTO `user` (
`user_id`,
`mail`
) VALUES (
"zero",
"zero@zeroplex.tw"
) ON DUPLICATE KEY UPDATE
`mail` = "zero@zeroplex.tw"
上述語法,會讓 MySQL 執行時,若發現 zero 這個使用者已經存在時,變自動去更新他的 mail。
Puzzle Together – 電腦上的自訂拼圖遊戲
Puzzle Together 是最近在 Steam 上看到新推出的遊戲,除了可以下載、購買圖畫、自己挑選拼圖難度,還可以建立多人連線和同好一起自虐挑戰。
