約定和編程風格 每次我想要演示實際代碼時,我會對mysql客戶端的屏幕就出現的代碼進行調整,將字體改成Courier,使他們看起來與普通文本不一樣(讓大家區別程序代碼和正文)。在這里舉個例子: mysql DROP FUNCTION f;Query OK, 0 rows affected (0.00 sec)
約定和編程風格mysql> DROP FUNCTION f; Query OK, 0 rows affected (0.00 sec)
mysql> CREATE PROCEDURE p () -> BEGIN -> /* This procedure does nothing */ <-- -> END;// Query OK, 0 rows affected (0.00 sec)
MySQL早期版本的用戶長期有需要觸發器的要求。 我們曾經許諾支持所有ANSI標準的特性。 您可以使用它來檢查或預防壞的數據進入數據庫。 您可以改變或者取消INSERT, UPDATE以及DELETE語句。 您可以在一個會話中監視數據改變的動作。
復合語句(BEGIN / END)是合法的. 流控制(Flow-of-control)語句(IF, CASE, WHILE, LOOP, WHILE, REPEAT, LEAVE,ITERATE)也是合法的. 變量聲明(DECLARE)以及指派(SET)是合法的. 允許條件聲明. 異常處理聲明也是允許的. 但是在這里要記住函數有受限條件:不能在函數中訪問表. 因此在函數中使用以下語句是非法的。 ALTER 'CACHE INDEX' CALL COMMIT CREATE DELETE DROP 'FLUSH PRIVILEGES' GRANT INSERT KILL LOCK OPTIMIZE REPAIR REPLACE REVOKE ROLLBACK SAVEPOINT 'SELECT FROM table' 'SET system variable' 'SET TRANSACTION' SHOW 'START TRANSACTION' TRUNCATE UPDATE 在觸發器中也有完全一樣的限制.
1. 語法:命名規則 CREATE TRIGGER <觸發器名稱> <-- { BEFORE | AFTER } { INSERT | UPDATE | DELETE } ON <表名稱> FOR EACH ROW <觸發器SQL語句>
2. 語法:觸發時間 CREATE TRIGGER <觸發器名稱> { BEFORE | AFTER } <-- { INSERT | UPDATE | DELETE } ON <表名稱> FOR EACH ROW <觸發的SQL語句> 觸發器有執行的時間設置:可以設置為事件發生前或后。 3. 語法:事件 CREATE TRIGGER <觸發器名稱> { BEFORE | AFTER } { INSERT | UPDATE | DELETE } <-- ON <表名稱> FOR EACH ROW <觸發的SQL語句> 同樣也能設定觸發的事件:它們可以在執行insert、update或delete的過程中觸發。 4. 語法:表 CREATE TRIGGER <觸發器名稱> { BEFORE | AFTER } { INSERT | UPDATE | DELETE } ON <表名稱> <-- FOR EACH ROW <觸發的SQL語句> 觸發器是屬于某一個表的:當在這個表上執行插入、 更新或刪除操作的時候就導致觸發器的激活. 我們不能給同一張表的同一個事件安排兩個觸發器。 5. 語法:( 步長)觸發間隔 CREATE TRIGGER <觸發器名稱> { BEFORE | AFTER } { INSERT | UPDATE | DELETE } ON <表名稱> FOR EACH ROW <-- <觸發的SQL語句> 觸發器的執行間隔:FOR EACH ROW子句通知觸發器 每隔一行執行一次動作,而不是對整個表執行一次。 6. 語法:語句 CREATE TRIGGER <觸發器名稱> { BEFORE | AFTER } { INSERT | UPDATE | DELETE } ON <表名稱> FOR EACH ROW <觸發的SQL語句> <-- 觸發器包含所要觸發的SQL語句:這里的語句可以是任何合法的語句, 包括復合語句,但是這里的語句受的限制和函數的一樣。 Privileges權限 你必須擁有相當大的權限才能創建觸發器(CREATE TRIGGER)。 如果你已經是Root用戶,那么就足夠了。這跟SQL的標準有所不同。 因此在下一個版本的MySQL中, 你完全有可能看到有一種叫做CREATE TRIGGER的新權限。 然后通過這樣的方法賦予: GRANT CREATE TRIGGER ON <表名稱> TO <用戶或用戶列表>; 也可以通過這樣收回權限: REVOKE CREATE TRIGGER ON <表名稱> FROM <用戶或用戶列表>;
CREATE TRIGGER t21_au BEFORE UPDATE ON t22 FOR EACH ROW BEGIN SET @old = OLD . s1; SET @new = NEW.s1; END;// 現在如果t21表中的s1列的值是55,那么執行了 "UPDATE t21 SET s1 = s1 + 1"之后@old的值會變成55, 而@new的值將會變成56。
Example of CREATE and INSERT CREATE和INSERT的例子 創建有觸發器的表 這里所有的例程中我都假定大家的分隔符已經設置成//(DELIMITER //)。 CREATE TABLE t22 (s1 INTEGER)// CREATE TRIGGER t22_bi BEFORE INSERT ON t22 FOR EACH ROW BEGIN SET @x = 'Trigger was activated!'; SET NEW.s1 = 55; END;//
mysql> SELECT @x, t22.* FROM t22// +------------------------+------+ | @x | s1 | +------------------------+------+ | Trigger was activated! | 55 | +------------------------+------+ 1 row in set (0.00 sec)
"check"完整性約束例子 什么是"check"約束 在標準的SQL語言中,我們可以在(CREATE TABLE)創建表的過程中使用"CHECK (condition)", 例如: CREATE TABLE t25 (s1 INT, s2 CHAR(5), PRIMARY KEY (s1), CHECK (LEFT(s2,1)='A')) ENGINE=INNODB;
CREATE TABLE t25 (s1 INT, s2 CHAR(5), PRIMARY KEY (s1)) ENGINE=INNODB// CREATE TRIGGER t25_bi BEFORE INSERT ON t25 FOR EACH ROW IF LEFT(NEW.s2,1)<>'A' THEN SET NEW.s1=0; END IF;// CREATE TRIGGER t25_bu BEFORE UPDATE ON t25 FOR EACH ROW IF LEFT(NEW.s2,1)<>'A' THEN SET NEW.s1=0; END IF;//
INSERT INTO t25 VALUES (0,'a') /* priming the pump */ // INSERT INTO t25 VALUES (5,'b') /* gets error '23000' */ // Don't Believe The Old MySQL Manual
聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com