logo

„MySQL“ IŠTRINIMO KASKADĄ

ON DELETE CASCADE sąlyga MySQL naudojamas automatiškai pašalinti atitinkančius įrašus iš antrinės lentelės, kai ištriname eilutes iš pirminės lentelės. Tai tam tikras orientacinis veiksmas, susijęs su svetimas raktas .

Tarkime, kad sukūrėme dvi lenteles su UŽSIENIO RAKTU, esančiu išorinio rakto ryšyje, todėl abi lenteles padarėme pagrindine ir antrine. Tada vienam UŽSIENIO RAKTUI apibrėžiame sąlygą ON DELETE CASCADE, kuri turi būti nustatyta kitam, kad pavyktų atlikti pakopines operacijas. Jei ON DELETE CASCADE apibrėžta tik vienai sąlygai FOREIGN KEY, kaskados operacijos sukels klaidą.

MySQL ON DELETE CASCADE Pavyzdys

Supraskime, kaip galime naudoti ON DELETE CASCADE sąlygą MySQL lentelėje. Pirmiausia sukursime dvi pavadintas lenteles Darbuotojas ir apmokėjimas . Abi lentelės yra susietos per išorinį raktą su trynimo kaskados operacija. Čia darbuotojas yra tėvų stalas , o Mokėjimas yra vaikiškas stalas . Šie scenarijai sukuria abi lenteles kartu su jų įrašais.

Lentelė: Darbuotojas

Šis teiginys sukuria lentelę Darbuotojas:

 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) ); 

Tada vykdykite įterpimo užklausą, kad užpildytumėte įrašus.

 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'); 

Vykdykite SELECT užklausą, kad patikrintumėte duomenis į lentelę, kuri gali būti parodyta žemiau:

„MySQL“ IŠTRINIMO KASKADĄ

Lentelė: Mokėjimas

Žemiau pateiktas teiginys sukuria lentelę Mokėjimas:

 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 ); 

Toliau vykdykite įterpti teiginį įrašyti įrašus į lentelę.

 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'); 

Vykdykite SELECT užklausą, kad patikrintumėte duomenis į lentelę, kuri gali būti parodyta žemiau:

„MySQL“ IŠTRINIMO KASKADĄ

Leisk mums Ištrinti duomenys iš pirminės lentelės Darbuotojas. Norėdami tai padaryti, vykdykite šį teiginį:

 mysql> DELETE FROM Employee WHERE emp_id = 102; 

Aukščiau pateiktas pareiškimas ištrins darbuotojo įrašus, kurių emp_id = 102 ir nuoroda duomenis į vaikų lentelę. Duomenis galime patikrinti naudodami SELECT teiginį, kuris duos tokią išvestį:

„MySQL“ IŠTRINIMO KASKADĄ

Aukščiau pateiktame išvestyje matome, kad visos eilutės, nurodančios emp_id = 102, buvo automatiškai ištrintos iš abiejų lentelių.

Kaip rasti paveiktą lentelę ON DELETE CASCADE veiksmas?

Kartais, prieš ištrindami įrašus iš lentelės, norime žinoti lentelę, kurią paveikė nuorodas veiksmas ON DELETE CASCADE. Šią informaciją galime rasti pateikę užklausą iš informacijos_schemos duomenų bazės referential_constraints taip:

 USE information_schema; SELECT table_name FROM referential_constraints WHERE constraint_schema = 'database_name' AND referenced_table_name = 'parent_table' AND delete_rule = 'CASCADE' 

Toliau pateiktame sakinyje pateikiamas rezultatas apie lenteles, susietas su lentele Darbuotojas su taisykle ON DELETE CASCADE darbuotojasdb duomenų bazė:

 USE information_schema; SELECT table_name FROM referential_constraints WHERE constraint_schema = 'employeedb' AND referenced_table_name = 'Employee' AND delete_rule = 'CASCADE'; 

Įvykdę aukščiau pateiktą komandą, gausime žemiau pateiktą išvestį:

„MySQL“ IŠTRINIMO KASKADĄ

MySQL ATNAUJINIMO KASKADOJE

ON UPDATE CASCADE sąlyga MySQL turi įprotį atnaujinti atitinkančius įrašus iš antrinės lentelės automatiškai, kai atnaujiname pirminės lentelės eilutes. Toliau pateiktame pavyzdyje tai aiškiau paaiškinama.

Pirma, turime naudoti PAKEISTI LENTELĘ pareiškimą, kad į lentelę Mokėjimas būtų įtraukta sąlyga ON UPDATE CASCADE, kaip nurodyta toliau:

 ALTER TABLE Payment ADD CONSTRAINT `payment_fk` FOREIGN KEY(emp_id) REFERENCES Employee (emp_id) ON UPDATE CASCADE; 

Tai duos tokią išvestį:

„MySQL“ IŠTRINIMO KASKADĄ

Žemiau esančiame scenarijuje mes atnaujinsime darbuotojo ID pagrindinėje lentelėje, o šis pakeitimas automatiškai atsispindės ir antrinėje lentelėje:

 mysql> UPDATE Employee SET emp_id = 102 WHERE emp_id = 103; 

Patikrinę lentelės „Darbuotojas ir apmokėjimas“ turinį, tai pamatysime emp_id stulpelių reikšmės bus sėkmingai atnaujintos.

„MySQL“ IŠTRINIMO KASKADĄ