MySQL
TRIGGERS
Sök…
Syntax
- SKAPA [DEFINER = {användare | CURRENT_USER}] TRIGGER trigger_name trigger_time trigger_event ON tbl_name FOR EACH ROW [trigger_order] trigger_body
- trigger_time: {FÖRE | EFTER }
- trigger_event: {INSERT | UPPDATERING | DELETE}
- trigger_order: {FOLLOWS | PRECEDES} other_trigger_name
Anmärkningar
Två punkter måste uppmärksamma dig om du redan använder triggers på andra DB:
FÖR VARJE RAD
FOR EACH ROW
är en obligatorisk del av syntaxen
Du kan inte göra en uttalande trigger (en gång efter fråga) som Oracle gör. Det är mer en prestationsrelaterad fråga än en verklig saknad funktion
SKAPA ELLER Byt ut TRIGGER
CREATE OR REPLACE
stöds inte av MySQL
MySQL tillåter inte denna syntax, du måste istället använda följande:
DELIMITER $$
DROP TRIGGER IF EXISTS myTrigger;
$$
CREATE TRIGGER myTrigger
-- ...
$$
DELIMITER ;
Var försiktig, detta är inte en atomtransaktion :
- du tappar den gamla utlösaren om
CREATE
misslyckas - på en tung belastning kan andra operationer inträffa mellan
DROP
ochCREATE
, användLOCK TABLES myTable WRITE;
först för att undvikaUNLOCK TABLES;
ochUNLOCK TABLES;
efterCREATE
att släppa tabellen
Grundläggande utlösare
Skapa bord
mysql> CREATE TABLE account (acct_num INT, amount DECIMAL(10,2));
Query OK, 0 rows affected (0.03 sec)
Skapa triggare
mysql> CREATE TRIGGER ins_sum BEFORE INSERT ON account
-> FOR EACH ROW SET @sum = @sum + NEW.amount;
Query OK, 0 rows affected (0.06 sec)
CREATE TRIGGER-uttalandet skapar en trigger som heter ins_sum som är associerad med kontotabellen. Den innehåller också klausuler som anger tidpunkten för utlösningsåtgärd, utlösningshändelse och vad man ska göra när utlösaren aktiveras
Infoga värde
För att använda avtryckaren ställer du in ackumulatorvariabeln (@sum) på noll, kör ett INSERT-uttalande och ser sedan vilket värde variabeln har efteråt:
mysql> SET @sum = 0;
mysql> INSERT INTO account VALUES(137,14.98),(141,1937.50),(97,-100.00);
mysql> SELECT @sum AS 'Total amount inserted';
+-----------------------+
| Total amount inserted |
+-----------------------+
| 1852.48 |
+-----------------------+
I det här fallet är värdet på @sum efter INSERT-uttalandet 14,98 + 1937,50 - 100 eller 1852,48.
Drop Trigger
mysql> DROP TRIGGER test.ins_sum;
Om du tappar ett bord, släpps också alla triggers för tabellen.
Typer av utlösare
timing
Det finns två modifierare för utlösning av åtgärdstider:
-
BEFORE
trigger aktiveras innan begäran körs, -
AFTER
utlösa brand efter byte.
Triggerande händelse
Det finns tre händelser som triggers kan kopplas till:
-
INSERT
-
UPDATE
-
DELETE
Innan du sätter in triggerexempel
DELIMITER $$
CREATE TRIGGER insert_date
BEFORE INSERT ON stack
FOR EACH ROW
BEGIN
-- set the insert_date field in the request before the insert
SET NEW.insert_date = NOW();
END;
$$
DELIMITER ;
Exempel före uppdatering
DELIMITER $$
CREATE TRIGGER update_date
BEFORE UPDATE ON stack
FOR EACH ROW
BEGIN
-- set the update_date field in the request before the update
SET NEW.update_date = NOW();
END;
$$
DELIMITER ;
Efter Radera exempel
DELIMITER $$
CREATE TRIGGER deletion_date
AFTER DELETE ON stack
FOR EACH ROW
BEGIN
-- add a log entry after a successful delete
INSERT INTO log_action(stack_id, deleted_date) VALUES(OLD.id, NOW());
END;
$$
DELIMITER ;