Portál AbcLinuxu, 9. listopadu 2025 11:25
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.