Stergere randuri tabel mysql in functie de alt tabel
Discutii despre script-uri si coduri PHP-MySQL, precum si lucru cu XML in PHP.
-
sterica
- Mesaje:285
Stergere randuri tabel mysql in functie de alt tabel
Salutare,
Exista posibilitatea ca valorile unui tabel sa depinda de valorile unei coloane dintr-un alt tabel?
Si anume:
Am urmatoarele tabele:
Cod: Selectaţi tot
personal
+----+------+-------+
| id | nume | stare |
+----+------+-------+
| 3 | pop | activ |
+----+------+-------+
table
+----+------+-----+
| id | id_p |nume |
+----+------+-----+
| 1 | 3 | pop |
+----+------+-----+
In tabela personal cand id-ul 3 are stare inactiv, in tabela table sa se stearga liniile aferente id-ului 3 in coloana id_p.
Multumesc!
MarPlo
Mesaje:4343
Salut
Poti sa folosesti acest sql query (sterge randurile din tabel table2 in functie de valoare coloanei 'stare' din tabelul personal):
Cod: Selectaţi tot
DELETE FROM table2 WHERE id_p IN (SELECT id FROM personal WHERE stare ='inactiv')
sterica
Mesaje:285
Acest query banuiesc ca il execut cu ajutorul php-ului, l-as putea face sa ruleze automat la schimbarea valorilor din coloana stare?
MarPlo
Mesaje:4343
Da, acel cod il poti pune sa se execute intr-un script php pe server.
Din ce am vazut pe net, ca sa ruleze automat un cod sql la nivel mysql ar trebui inregistrat acel cod in baza de date cu un "CREATE EVENT". Dar eu nu ma pricep la mysql avansat, cum ar fi rulare automat comenzi si functii sql.
Incearca sa intrebi si pe alte forumuri de specialitate mysql.
sterica
Mesaje:285
Multumesc mult de ajutor, acum stiu in ce directie sa ma informez.
sterica
Mesaje:285
Pentru cei care vor citi topicul, am gasit rezolvarea problemei, defapt am primit-o
Cod: Selectaţi tot
CREATE TRIGGER bfr_upd_activity BEFORE UPDATE ON personal
FOR EACH ROW
BEGIN
if new.stare <> 'inactiv' then
delete from my_table where id_p = new.id;
end if;
END;
Poate in timp cineva este in masura sa ne ajute cu cateva explicatii, o sa adaug si eu ceea ce banuiesc ca se intampla in codul de mai jos:
In workbench lucrurile stau putin mai explicite:
Cod: Selectaţi tot
// cu aceasta linie de cod banuiesc ca mysql-ul se asigura ca nu mai exista in aceasi baza de date acelasi nume pt trigger
DROP TRIGGER IF EXISTS `my_database`.`bfr_upd_activity`;
DELIMITER $$ // aceasta linie de cod nu stiu ce face, nici cele doua $$
USE `my_databas`$$ // banuiesc ca aceasta linie de cod indica ca se va folosi aceasta baza de date pentru crearea triggerului
// prin CREATE DEFINER - banuiesc ca se oferta acces catre userul care va putea beneifica de trigger
// prin TRIGGER - cred ca se seteaza numele trigger-ului
// prin BEFORE UPDATE - este tipul actiunii la care sa reactioneze liniile de cod de mai jos
// iar FOR EACH ROW - unde anume sa actioneze codul
CREATE DEFINER=`root`@`localhost` TRIGGER `bfr_upd_activity` BEFORE UPDATE ON `personal` FOR EACH ROW
BEGIN
if new.stare <> 'inactiv' then // acel new nu stiu ce face
delete from my_table where id_p = new.id; // la fel si aici nu stiu care rol are acel new
end if;
END$$
DELIMITER ;
MarPlo
Mesaje:4343
Ca sa nu deviez de la subiectul acestui topic, am creat altul cu explicatii despre DELIMITER $$, folosind ca exemplu codul dat de tine aici.
Vezi pagina de la adresa:
//marplo.net/forum/delimiter-mysql-t2644.htm