 |
| Hinweise |
Willkommen im TP-Hilfe-Forum!Dies ist ein Forum zu den Themen Photoshop, Dreamweaver, Flash, Selbständigkeit und mehr, in dem Du Hilfe, Anleitung oder eine Lösung zu Deinen Problemen erhältst. Aktuell bist Du in unseren Foren als Gast mit reinen Leserechten unterwegs. Wenn Du Dich registrierst, kannst Du eigene Themen verfassen, deine Frage stellen und privat mit anderen TPlern kommunizieren. Weitere Foren werden zugänglich, und Du wirst – falls gewünscht – per Mail über neue Beiträge informiert. Die Registrierung ist schnell und kostenlos. Sollten bei der Registrierung Fragen auftauchen, reicht ein Klick in unsere Hilfe - Häufig gestellte Fragen oder eine kurze Mitteilung an das Support-Team. Viel Spaß bei Traum-Projekt.com |
18.09.2007, 12:37
|
#1
|
|
TP-Senior
Registriert seit: Jun 2004
Ort: leipzig
|
trigger in mysql 5.0
hallo,
ich habe eine tabelle test:
id | a | b
und ich möchte, das maximal drei gleiche einträge in der spalte b existieren. ich habe hier folgenden trigger:
DELIMITER |
DROP TRIGGER b_count_check;
CREATE TRIGGER b_count_check BEFORE INSERT ON test
FOR EACH ROW BEGIN
DECLARE amount INT;
SELECT COUNT('NEW.b') INTO amount FROM `test`;
IF amount <= 3 THEN
INSERT INTO `test` SET `a` = 'NEW.a',`b` = 'NEW.b';
END IF;
END; |
DELIMITER ;
dieser trigger wird auch ohne fehlermeldung installiert, will ich aber nun etwas einfügen, kommt folgende fehlermeldung:
ERROR 1442 (HY000): Can't update table 'test' in stored function/trigger because it is already used by statement which invoked this stored function/trigger.
wo liegt das problem?
__________________
BeCreated - Geduld und Zeit für Ihre Wünsche
|
|
|
18.09.2007, 12:55
|
#2
|
|
TP-Special Mod
Registriert seit: Feb 2005
Ort: Haan / NRW
|
im Bugtracker von MySQL gibts dazu folgende Anmerkung:
Zitat:
I dont think this is a bug. Its clearly stated in MySql manual under trigger limitations
that one can not select from the table on which the trigger is firing from within that
trigger.
As far as I know, this not allowed in any database, for example Oracle will generated
table mutating error under similar circumstances.
|
|
|
|
18.09.2007, 13:00
|
#3
|
|
TP-Moderator
Registriert seit: Feb 2001
Ort: Helmstedt/Wolfsburg
|
naja... sollte das so ablaufen, gerät das Teil doch in eine Endlosschleife, da der Trigger IMMER vor dem Insert aufgerufen wird. Es also so gesehen zu keinem wirklichen Insert kommt bis die Trigger durch sind...
Zusätzlich musst du einfach nur ein RETURN FALSE in deiner Bedingung setzten und das Ergebnis sollte passen...
Allerding denke ich, dass die NEW.b usw. in single quotes fehlerhaft sind.
...und gerade kommt Steffens Kommentar reingeflogen: Das kann natürlich auch sein :-)
Gruß
Jan
|
|
|
18.09.2007, 13:17
|
#4
|
|
TP-Senior
Registriert seit: Jun 2004
Ort: leipzig
|
danke erstmal für die antworten, das klingt logisch.
@stuck mojo: hm, naja, so:
DELIMITER |
DROP TRIGGER b_count_check;
CREATE TRIGGER b_count_check BEFORE INSERT ON test
FOR EACH ROW BEGIN
DECLARE amount INT;
SELECT COUNT('NEW.b') INTO amount FROM `test`;
IF amount > 3 THEN
RETURN FALSE;
END IF;
END; |
DELIMITER ;
? dann erhalte ich nämlich beim erstellen des triggers das hier:
ERROR 1313 (42000) at line 2: RETURN is only allowed in a FUNCTION
__________________
BeCreated - Geduld und Zeit für Ihre Wünsche
|
|
|
18.09.2007, 13:54
|
#5
|
|
TP-Moderator
Registriert seit: Feb 2001
Ort: Helmstedt/Wolfsburg
|
ach... hatte kurz in den User-Comments in dem Manual geschaut und da hatte einer genau diesen Tip gegeben... Aber andere haben dies dann doch wiederlegt. Dann passts wohl doch nicht.
Schau mal selber: http://dev.mysql.com/doc/refman/5.0/...e-trigger.html
...oder du überlegst dir einen anderen Weg.
|
|
|
18.09.2007, 14:10
|
#6
|
|
TP-Senior
Registriert seit: Jun 2004
Ort: leipzig
|
das einzige was mir jetzt noch einfällt ist ein trigger nach dem insert der dann die zeile wieder löscht...ich war zwar in den vorlesungen datenbanksysteme 1 + 2 gar nicht mal so schlecht, aber so wirklich erinnern kann ich mich halt auch nicht mehr :-)
edit: löschen geht auch nicht, ist ja wieder die gleiche tabelle => gleiche fehlermeldung wie oben. gnarf. naja, dann gibts eben einen workaround.
__________________
BeCreated - Geduld und Zeit für Ihre Wünsche
Geändert von feuervogel (18.09.2007 um 14:18 Uhr).
|
|
|
18.09.2007, 20:10
|
#7
|
|
TP-Senior
Registriert seit: Jun 2004
Ort: leipzig
|
so, hier der korrektheits halber noch mal der getestete und für richtig befundene trigger:
DELIMITER |
DROP TRIGGER b_count_check;
CREATE TRIGGER b_count_check BEFORE INSERT ON test
FOR EACH ROW BEGIN
DECLARE amount INT;
SELECT COUNT(`id`) INTO amount FROM `test` WHERE `b` = NEW.b;
IF amount > 5 THEN
SET NEW.flag = 2;
END IF;
END; |
DELIMITER ;
von zeit zu weit werden die einträge mit flag = 2 gelöscht und sonst nur die mit flag < 2 genutzt. das ist jetzt mein workaround.
__________________
BeCreated - Geduld und Zeit für Ihre Wünsche
|
|
|
|
Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
|
|
|
| Themen-Optionen |
Thema durchsuchen |
|
|
|
| Thema bewerten |
|
|
Forumregeln
|
Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.
HTML-Code ist aus.
|
|
|
Alle Zeitangaben in WEZ +2. Es ist jetzt 13:03 Uhr.
|
 |