Portál AbcLinuxu, 10. května 2025 12:16
tabulka1 jmeno heslo tabulka2 jmeno data1 data2 ... tabulka3 jmeno data1 da... tabulka...Potreboval bych, aby kdyz uzivatel1 existuje alespon v nejake z tabulek tabulka2-tabulkaN, tak aby existoval i v tabulka1. Pokud by se vymazal uzivatel1 z nejake tabulky tabulka2-tabulkaN a uz v zadne z techto tabulek neexistoval, tak by se automaticky vymazal i z tabulka1. Vim jak tohle vyresit pomoci PHP, ale chtel bych si to co mozna nejvice zjednodusit a pokud tohle pujde udelat primo pomoci mysql, budu rad. Pujde to, jak?
tabulka1: uživatel1 uživatel2 uživatel3 tabulka2: uživatel1 tabulka3: uživatel2 uživatel1 tabulka4: uživatel3 toto už správně není, protože uživatel1 neexistuje v žádných dalších tabulkách tabulka1: uživatel1 uživatel2 tabulka2: tabulka3: uživatel2 tabulka4: uživatel3 ani toto není správně, protože uživatel1 existuje v tabulka2, ale ne v tabulka1 tabulka1: uživatel2 uživatel3 tabulka2: uživatel1 tabulka3: uživatel2 tabulka4: uživatel3Na to bych asi potřeboval nějaké sofistikovanější propojení. Poradí někdo?
CREATE TRIGGER tr_deleteNotUsed AFTER UPDATE ON users FOR EACH ROW BEGIN DELETE FROM users WHERE username=NEW.username AND used=0; END; po update tabulky to vrací: #1442 - Can't update table 'users' in stored function/trigger because it is already used by statement which invoked this stored function/trigger.Dočetl jsem se že by to mohlo být kvůli zacyklení, ale tady se přeci nic necyklí. Kde dělám chybu?
DELIMITER $$ CREATE TRIGGER tr_incrementMain AFTER INSERT ON users FOR EACH ROW BEGIN CALL auth.pr_authUsed(NEW.username,NEW.password,1); END; DELIMITER $$ CREATE TRIGGER tr_decrementMain AFTER DELETE ON users FOR EACH ROW BEGIN CALL auth.pr_authUsed(OLD.username,"",0); END; DELIMITER $$ CREATE PROCEDURE pr_authUsed (uzivatel CHAR(255), heslo CHAR(255), posun INT) BEGIN DECLARE usedValue INT; IF (posun = 1) THEN BEGIN UPDATE `auth`.`users` SET `used` = used+1 WHERE `users`.`username` = uzivatel LIMIT 1; IF (ROW_COUNT()<1) THEN BEGIN INSERT INTO `auth`.`users` (`username`, `password`, `active`, `used`) VALUES (uzivatel,heslo,'1','1'); END; END IF; END; ELSE BEGIN UPDATE `auth`.`users` SET `used` = used-1 WHERE `users`.`username` = uzivatel LIMIT 1 ; SELECT `used` INTO usedValue FROM `auth`.`users` WHERE `users`.`username` = uzivatel LIMIT 1 ; IF (usedValue < 1) THEN BEGIN DELETE FROM `auth`.`users` WHERE `username` = uzivatel LIMIT 1 ; END; END IF; END; END IF; END
Tiskni
Sdílej:
ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.