Úvod
Spouštěče MySQL aplikují omezení na tabulky při přidávání, aktualizaci nebo odstraňování řádků tabulky.
Sloupce v MySQL uplatňují mírná omezení hodnot. Například nastavení datového typu sloupce jako tiny int a není null vyžaduje zadání malé číselné hodnoty. K zachování integrity dat je však zapotřebí více omezení.
Tento výukový program vám ukáže, jak používat spouštěče MySQL, a poskytuje příklady pro každý typ spouštěčů.
Předpoklady
- Systém běžící na databázovém serveru MySQL
- Uživatelský účet MySQL s oprávněními root
- Znalost základních příkazů MySQL (viz naše cheaty pro příkazy MySQL ke stažení)
Co je spouštěč v MySQL?
Spouštěč je pojmenovaný objekt MySQL, který se aktivuje, když v tabulce nastane událost. Spouštěče jsou konkrétní typ uložené procedury přidružené ke konkrétní tabulce.
Spouštěče umožňují přístup k hodnotám z tabulky pro účely porovnání pomocí NEW
a OLD
. Dostupnost modifikátorů závisí na spouštěcí události, kterou používáte:
Událost spuštění | STARÉ | NOVINKA |
INSERT | Ne | Ano |
AKTUALIZACE | Ano | Ano |
SMAZAT | Ano | Ne |
Kontrola nebo úprava hodnoty při pokusu o vložení dat způsobí, že NEW.<column name>
dostupný modifikátor. Je to proto, že tabulka je aktualizována novým obsahem. Naproti tomu OLD.<column name>
hodnota pro příkaz insert neexistuje, protože na jejím místě předem neexistuje žádná informace.
Při aktualizaci řádku tabulky jsou k dispozici oba modifikátory. Je zde OLD.<column name>
data, která chceme aktualizovat na NEW.<column name>
data.
Nakonec, když odebíráte řádek dat, OLD.<column name>
modifikátor přistupuje k odstraněné hodnotě. NEW.<column name>
neexistuje, protože po odstranění nic nenahrazuje starou hodnotu.
Příklad spouštění MySQL
Jako příklad aplikovaného spouštěče lze uvést vložení nových hodnot do tabulky person poskytuje jiný výsledek než původní vstup:
Všimněte si, že vložená jména byla zpočátku malá. Při výběru tabulky se první písmeno zobrazí jako velké. Přestože neexistuje žádný náznak, že by se něco odlišovalo od běžného příkazu insert, spouštěč se spustil před příkazem insert pro velké první písmeno jména.
Použití spouštěčů MySQL
Každý trigger spojený s tabulkou má jedinečný název a funkci založenou na dvou faktorech:
1. Čas . BEFORE
nebo AFTER
konkrétní událost řádku.
2. Událost . INSERT
, UPDATE
nebo DELETE
.
MySQL spouští spouštění v závislosti na době aktivace a události pro celkem šest jedinečných kombinací spouštěčů. Příkazy before pomáhají kontrolovat data a provádět změny před přijetím závazků, zatímco příkazy after nejprve potvrzují data a poté provádějí příkazy.
Provedení sady akcí se děje automaticky a ovlivní všechny vložené, odstraněné nebo aktualizované řádky v příkazu.
Vytvořit spouštěče
Použijte CREATE TRIGGER
syntaxe příkazu k vytvoření nového spouštěče:
CREATE TRIGGER <trigger name> <trigger time > <trigger event>
ON <table name>
FOR EACH ROW
<trigger body>;
Osvědčeným postupem je pojmenovat spouštěč následujícími informacemi:
<trigger time>_<table name>_<trigger event>
Například pokud se spouštěč spustí před vložením na stole s názvem zaměstnanec , nejlepší konvencí je volat spouštěč:
before_employee_insert
Případně je běžnou praxí použít následující formát:
<table name>_<first letter of trigger time><first letter of trigger name>
před vložením název spouštěče pro tabulku zaměstnanec vypadá takto:
employee_bi
Spouštěč se spustí v určitý čas události v tabulce definované pomocí
Smazat spouštěče
Chcete-li spouštěč odstranit, použijte DROP TRIGGER
prohlášení:
DROP TRIGGER <trigger name>;
Případně použijte:
DROP TRIGGER IF EXISTS <trigger name>;
Chybová zpráva se nezobrazuje, protože neexistuje žádný spouštěč, takže se nevytiskne žádné varování.
Vytvořit ukázkovou databázi
Vytvořte databázi pro ukázkové kódy spouštěče s následující strukturou:
1. Vytvořte tabulku s názvem osoba s jménem a věk pro sloupce.
CREATE TABLE person (name varchar(45), age int);
Vložte ukázková data do tabulky:
INSERT INTO person VALUES ('Matthew', 25), ('Mark', 20);
Výběrem tabulky zobrazíte výsledek:
SELECT * FROM person;
2. Vytvořte tabulku s názvem průměrný_věk se sloupcem nazvaným průměr :
CREATE TABLE average_age (average double);
Do tabulky vložte hodnotu průměrného věku:
INSERT INTO average_age SELECT AVG(age) FROM person;
Výběrem tabulky zobrazíte výsledek:
SELECT * FROM average_age;
3. Vytvořte tabulku s názvem archiv_osob s jménem , věk a čas sloupce:
CREATE TABLE person_archive (
name varchar(45),
age int,
time timestamp DEFAULT NOW());
Vytvořte spouštěč PŘED VLOŽENÍM
Chcete-li vytvořit BEFORE INSERT
spoušť, použijte:
CREATE TRIGGER <trigger name> BEFORE INSERT
ON <table name>
FOR EACH ROW
<trigger body>;
BEFORE INSERT
trigger poskytuje kontrolu nad modifikací dat před potvrzením do databázové tabulky. Kapitalizace názvů pro konzistenci, kontrola délky vstupu nebo zachycení chybných vstupů pomocí BEFORE INSERT
triggery dále poskytují omezení hodnot před zadáním nových dat.
PŘED INSERT Příklad spouštěče
Vytvořte BEFORE INSERT
spouštěč pro kontrolu hodnoty věku před vložením dat do osoby tabulka:
delimiter //
CREATE TRIGGER person_bi BEFORE INSERT
ON person
FOR EACH ROW
IF NEW.age < 18 THEN
SIGNAL SQLSTATE '50001' SET MESSAGE_TEXT = 'Person must be older than 18.';
END IF; //
delimiter ;
Vložením dat se aktivuje spouštěč a zkontroluje se hodnota věku před odesláním informace:
INSERT INTO person VALUES ('John', 14);
Konzola zobrazí popisnou chybovou zprávu. Data se do tabulky nevloží z důvodu neúspěšné kontroly spouštěče.
Vytvořte spouštěč PO INSERT
Vytvořte AFTER INSERT
spusťte pomocí:
CREATE TRIGGER <trigger name> AFTER INSERT
ON <table name>
FOR EACH ROW
<trigger body>;
AFTER INSERT
trigger je užitečný, když zadaný řádek generuje hodnotu potřebnou k aktualizaci jiné tabulky.
PO VLOŽENÍ Příklad spouštěče
Vložení nového řádku do osoby tabulka automaticky neaktualizuje průměr v průměrném_věku stůl. Vytvořte AFTER INSERT
spustit u osoby pro aktualizaci average_age tabulka po vložení:
delimiter //
CREATE TRIGGER person_ai AFTER INSERT
ON person
FOR EACH ROW
UPDATE average_age SET average = (SELECT AVG(age) FROM person); //
delimiter ;
Vložení nového řádku do osoby tabulka aktivuje spouštěč:
INSERT INTO person VALUES ('John', 19);
Data se úspěšně odevzdají osobě tabulku a aktualizuje průměrný_věk tabulka se správnou průměrnou hodnotou.
Vytvořte spouštěč PŘED AKTUALIZACÍ
Proveďte BEFORE UPDATE
spusťte pomocí:
CREATE TRIGGER <trigger name> BEFORE UPDATE
ON <table name>
FOR EACH ROW
<trigger body>;
BEFORE UPDATE
spouštěče jsou spolu s BEFORE INSERT
spouštěče. Pokud před vložením dat existují nějaká omezení, měla by zde být také před aktualizací.
PŘED AKTUALIZACÍ Příklad spouštěče
Pokud existuje věkové omezení pro osobu před vložením dat, věkové omezení by mělo existovat také před aktualizací informací. Bez BEFORE UPDATE
spoušť, spoušti kontroly věku se lze snadno vyhnout. Nic neomezuje úpravy na chybnou hodnotu.
Přidejte BEFORE UPDATE
spustit na osobu tabulka se stejným tělem jako BEFORE INSERT
spoušť:
delimiter //
CREATE TRIGGER person_bu BEFORE UPDATE
ON person
FOR EACH ROW
IF NEW.age < 18 THEN
SIGNAL SQLSTATE '50002' SET MESSAGE_TEXT = 'Person must be older than 18.';
END IF; //
delimiter ;
Aktualizace existující hodnoty aktivuje kontrolu spouštění:
UPDATE person SET age = 17 WHERE name = 'John';
Aktualizace věku na hodnotu menší než 18 zobrazí chybovou zprávu a informace se neaktualizují.
Vytvořte spouštěč PO AKTUALIZACI
Pomocí následujícího bloku kódu vytvořte AFTER UPDATE
spoušť:
CREATE TRIGGER <trigger name> AFTER UPDATE
ON <table name>
FOR EACH ROW
<trigger body>;
AFTER UPDATE
trigger pomáhá sledovat potvrzené změny dat. Nejčastěji k jakýmkoli změnám po vložení informací dojde také po aktualizaci dat.
PO AKTUALIZACI Příklad spouštěče
Všechny úspěšné aktualizace věku údaje v tabulce osoba měli také aktualizovat střední průměrnou hodnotu vypočítanou v průměrném_věku tabulka.
Vytvořte AFTER UPDATE
spustí aktualizaci průměrného_věku tabulky po aktualizaci řádku v osobě tabulka:
delimiter //
CREATE TRIGGER person_au AFTER UPDATE
ON person
FOR EACH ROW
UPDATE average_age SET average = (SELECT AVG(age) FROM person); //
delimiter ;
Aktualizace existujících dat změní hodnotu v osobě tabulka:
UPDATE person SET age = 21 WHERE name = 'John';
Aktualizace tabulky osoba také aktualizuje průměr v průměrném_věku tabulka.
Vytvořte spouštěč PŘED ODSTRANĚNÍM
Chcete-li vytvořit BEFORE DELETE
spoušť, použijte:
CREATE TRIGGER <trigger name> BEFORE DELETE
ON <table name>
FOR EACH ROW
<trigger body>;
BEFORE DELETE
spoušť je nezbytná z bezpečnostních důvodů. Pokud má nadřazená tabulka připojené nějaké potomky, spouštěč pomáhá zablokovat odstranění a zabrání osamoceným tabulkám. Spouštěč také umožňuje archivaci dat před vymazáním.
PŘED DELETE Příklad spouštěče
Archivujte smazaná data vytvořením BEFORE DELETE
spoušť na stole osoba a vložte hodnoty do archivu_osob tabulka:
delimiter //
CREATE TRIGGER person_bd BEFORE DELETE
ON person
FOR EACH ROW
INSERT INTO person_archive (name, age)
VALUES (OLD.name, OLD.age); //
delimiter ;
Mazání dat z tabulky osoba archivuje data do archivu_osob tabulky před odstraněním:
DELETE FROM person WHERE name = 'John';
Vložení hodnoty zpět do osoby tabulka uchovává protokol smazaných dat v archivu_osob tabulka:
INSERT INTO person VALUES ('John', 21);
BEFORE DELETE
trigger je užitečný pro protokolování jakýchkoli pokusů o změnu tabulky.
Vytvořte spouštěč PO DELETE
Proveďte AFTER DELETE
spusťte pomocí:
CREATE TRIGGER <trigger name> AFTER DELETE
ON <table name>
FOR EACH ROW
<trigger body>;
AFTER DELETE
spouštěče udržují aktualizace informací, které vyžadují, aby před provedením aktualizací zmizel datový řádek.
PO DELETE Příklad spouštěče
Vytvořte AFTER DELETE
spoušť na stole osoba aktualizujte průměrný_věk tabulka s novými informacemi:
delimiter //
CREATE TRIGGER person_ad AFTER DELETE
ON person
FOR EACH ROW
UPDATE average_age SET average = (SELECT AVG(person.age) FROM person); //
delimiter ;
Smazání záznamu z tabulky osoba aktualizuje průměrný_věk tabulka s novým průměrem:
Bez AFTER DELETE
informace se automaticky neaktualizují.
Vytvořit více spouštěčů
MySQL nepodporuje spouštění více triggerů současně. Přidání více logických operací ke stejnému spouštěči je však možné. Použijte BEGIN
a END
oddělovače pro označení těla spouště:
CREATE TRIGGER <trigger name> <trigger time > <trigger event>
ON <table name>
FOR EACH ROW
BEGIN
<trigger body>;
END;
Před vytvořením spouštěče s více operacemi nezapomeňte změnit výchozí oddělovač.
Zobrazit spouštěče
Seznam všech spouštěčů v databázi pomocí:
SHOW triggers;
Výstup zobrazuje seznam všech spouštěčů, včetně názvu a obsahu příkazu:
Zobrazí se také další informace, jako je čas vytvoření a uživatel, který spouštěč vytvořil.