ON DELETE CASCADE -lausetta MySQL:ssä käytetään automaattisesti Poista vastaavat tietueet alitaulukosta, kun poistamme rivit ylätason taulukosta. Se on eräänlainen viittaustoiminto, joka liittyy vieras avain .
Oletetaan, että olemme luoneet kaksi taulukkoa, joissa on FORIGN KEY vierasavainsuhteessa, jolloin molemmista taulukoista on pää- ja lapsi. Seuraavaksi määritämme ON DELETE CASCADE -lauseen yhdelle FORIGN KEY:lle, joka on asetettava toiselle, jotta se onnistuu peräkkäisissä toiminnoissa. Jos ON DELETE CASCADE on määritetty vain yhdelle FOREIGN KEY -lauseelle, peräkkäiset toiminnot aiheuttavat virheen.
MySQL ON DELETE CASCADE Esimerkki
Ymmärrämme, kuinka voimme käyttää ON DELETE CASCADE -lausetta MySQL-taulukossa. Ensin aiomme luoda kaksi taulukkoa nimeltä Työntekijä ja maksu . Molemmat taulukot liittyvät viiteavaimen kautta poistokaskaditoiminnolla. Tässä työntekijä on vanhempien taulukko , ja Maksu on lasten pöytä . Seuraavat komentosarjat luovat molemmat taulukot tietueineen.
Taulukko: Työntekijä
Seuraava lause luo taulukon Työntekijä:
muokkausnäppäimet
CREATE TABLE Employee ( emp_id int(10) NOT NULL, name varchar(40) NOT NULL, birthdate date NOT NULL, gender varchar(10) NOT NULL, hire_date date NOT NULL, PRIMARY KEY (emp_id) );
Suorita seuraavaksi lisäyskysely täyttääksesi tietueet.
INSERT INTO Employee (emp_id, name, birthdate, gender, hire_date) VALUES (101, 'Bryan', '1988-08-12', 'M', '2015-08-26'), (102, 'Joseph', '1978-05-12', 'M', '2014-10-21'), (103, 'Mike', '1984-10-13', 'M', '2017-10-28'), (104, 'Daren', '1979-04-11', 'M', '2006-11-01'), (105, 'Marie', '1990-02-11', 'F', '2018-10-12');
Suorita SELECT-kysely vahvistaaksesi tiedot taulukkoon, joka voidaan näyttää alla:
Taulukko: Maksu
Alla oleva lausunto luo taulukon Maksu:
CREATE TABLE Payment ( payment_id int(10) PRIMARY KEY NOT NULL, emp_id int(10) NOT NULL, amount float NOT NULL, payment_date date NOT NULL, FOREIGN KEY (emp_id) REFERENCES Employee (emp_id) ON DELETE CASCADE );
Suorita seuraavaksi lisää lausunto täyttää tietueet taulukkoon.
INSERT INTO Payment (payment_id, emp_id, amount, payment_date) VALUES (301, 101, 1200, '2015-09-15'), (302, 101, 1200, '2015-09-30'), (303, 101, 1500, '2015-10-15'), (304, 101, 1500, '2015-10-30'), (305, 102, 1800, '2015-09-15'), (306, 102, 1800, '2015-09-30');
Suorita SELECT-kysely vahvistaaksesi tiedot taulukkoon, joka voidaan näyttää alla:
Anna meidän poistaa tiedot ylätason taulukosta Työntekijä. Voit tehdä tämän suorittamalla seuraavan lauseen:
mysql> DELETE FROM Employee WHERE emp_id = 102;
Yllä oleva lausunto poistaa työntekijätiedot, joiden emp_id = 102 ja viittaamalla tiedot lapsitaulukkoon. Voimme tarkistaa tiedot käyttämällä SELECT-lausetta, joka antaa seuraavan tulosteen:
Yllä olevassa tulosteessa voimme nähdä, että kaikki rivit, jotka viittaavat arvoon emp_id = 102, poistettiin automaattisesti molemmista taulukoista.
Miten löydän POISTA CASCADE -toiminnon vaikutuksen alaisen taulukon?
Joskus ennen tietueiden poistamista taulukosta haluamme tietää ON DELETE CASCADE -viittaustoiminnon taulukon, jota tämä koskee. Löydämme nämä tiedot tekemällä kyselyn information_schema-tietokannan referential_constraints-kohdasta seuraavasti:
USE information_schema; SELECT table_name FROM referential_constraints WHERE constraint_schema = 'database_name' AND referenced_table_name = 'parent_table' AND delete_rule = 'CASCADE'
Alla oleva lauseke tuottaa tuloksen taulukoista, jotka liittyvät Työntekijä-taulukkoon ON DELETE CASCADE -säännöllä työntekijädb tietokanta:
USE information_schema; SELECT table_name FROM referential_constraints WHERE constraint_schema = 'employeedb' AND referenced_table_name = 'Employee' AND delete_rule = 'CASCADE';
Yllä olevan komennon suorittamisen jälkeen saamme alla olevan tulosteen:
MySQL PÄIVITYSKASKADILLA
ON UPDATE CASCADE -lause MySQL on tapana päivittää vastaavat tietueet alitaulukosta automaattisesti, kun päivitämme ylätason taulukon rivit. Seuraava esimerkki selittää sen selkeämmin.
Ensinnäkin meidän on käytettävä MUUTTA TAULU lausunto ON UPDATE CASCADE -lausekkeen lisäämiseksi taulukkoon Maksu seuraavasti:
lateksiluettelot
ALTER TABLE Payment ADD CONSTRAINT `payment_fk` FOREIGN KEY(emp_id) REFERENCES Employee (emp_id) ON UPDATE CASCADE;
Se antaa seuraavan tulosteen:
Alla olevassa skriptissä päivitämme työntekijän tunnuksen ylätason taulukossa, ja se heijastaa tätä muutosta automaattisesti myös alitaulukossa:
mysql> UPDATE Employee SET emp_id = 102 WHERE emp_id = 103;
Tarkistamalla Työntekijä- ja maksutaulukon sisällön näemme sen emp_id sarakearvot päivitetään onnistuneesti.