Trigger vergleich zwischen mehreren Tabellen

PaulMueller

Benutzer
Beiträge
12
Hallo,

Ich versuche in einer IF ELSE Bedingung einen Vergleich zwischen zwei Tabellen durchzuführen.
Dazu lasse ich in dem After update trigger einen temp. Tabelle anlegen. Aber nach dem Update Befehl, bekomme ich folgende Meldung: ERROR 1109 Unknown table temp2 in field list.
Das Problem liegt im Vergleich new.name= temp2.name), da es ohne funktioniert.


CREATE DEFINER=`root1`@`%` TRIGGER `test`.`tabelle1_AFTER_UPDATE` AFTER UPDATE ON `tabelle1` FOR EACH ROW
BEGIN
DROP TEMPORARY TABLE temp2;
create temporary table temp2 SELECT * FROM tabelle2;
IF (new.a = 1 AND new.name= temp2.name)
THEN
INSERT INTO test3
(test3.wert) VALUE (350);
END IF;
END


Besten dank für die Hilfe!
 
Werbung:
vermutlich schlägt die Erstellung wegen Syntaxfehler fehl. Warum testet man sowas nicht mal? Was passiert, wenn tabelle2 mehr als einen Record hat?
 
Also Syntaxfehler bei der Erstellung schließe ich aus, da ich keinen Fehler bekommen, wenn ich die Bedingung AND new.produkt_id = temp2.produkt_id rausnehme.

Die Tabelle hat mehr als einen Eintrag, die aber auch benötigt werden.
 
hrm...

Code:
test=*# create table pv2 as select * from pv;
SELECT 9
test=*# rollback;
ROLLBACK
test=# create table pv2 select * from pv;
FEHLER:  Syntaxfehler bei »select«
LINE 1: create table pv2 select * from pv;
                         ^
test=*#
 
bei mit sieht es besser aus
create temporary table temp2 SELECT * FROM tabelle2;
15 row(s) affected Records: 15 Duplicates: 0 Warnings: 0
 
ich hatte gedacht, dass ich eine schleife einbaue, die vom minimalsten temp2 bis zu alle temp2 durchgeht bis der wert von new.name erreicht wurde.
soll ich den eigenlichen sachverhalt erklären, damit es verständlicher wird?
ich weiß ja nichtmal ob das so funktioniert, wie ich mir das gedacht habe.

statt = muss <= eingebaut werden, sorry:
IF (new.a = 1 AND new.name <= temp2.name)
 
ohje, das klingt furchtbar.

ich versuchs mal anders zu beschreiben:
ich muss vom Minimalwert der Tabelle 2 hochzählen bis wert new.name (aus tabelle1)
dazwischhen müssen verschiedene Bedingungen geprüft werden (zwischen Tabelle 1 und 2) und alle Bedingungen erfüllt sind, dann wird ein Insert in tabelle 3, ein Update in tabelle 1 und nochmal ein Insert in tabelle 2 durchgeführt werden.
 
... und das Update im Trigger auf Tabelle 1 triggert wieder den Update-Trigger der Tabelle 1, was einen TRIGGER in Tabelle 1 triggert, welcher einen Update in Tabelle 1 macht ...
 
daran habe ich schon gedacht und eine extra spalte eingefügt die zuerst geprüft wird. wenn dort der wert = true ist, dann geht es erst gar nicht in die schleife.
also wenn das Update in Tabelle 1 angestoßen wird, wird in die spalte true eingetragen.

ich die schleife nur starten lassen, wenn der wert false ist.
 
Werbung:
immerhin ;-)

Nun ja, ich nutze und programmiere nicht in MySQL. Vielleicht kommt der Fehler ja schon beim DROP.

DROP TABLE IF NOT EXISTS kann MySQL nicht, oder?

Code:
test=*# \h drop table
Command:     DROP TABLE
Description: remove a table
Syntax:
DROP TABLE [ IF EXISTS ] name [, ...] [ CASCADE | RESTRICT ]

URL: https://www.postgresql.org/docs/13/sql-droptable.html

test=*#

vermutlich nicht, wäre zu cool. Conditional TRIGGER, um Dein wert=true zu prüfen BEVOR der Trigger feuert kann es ja auch nicht ...

Code:
test=*# \h create trigger
Command:     CREATE TRIGGER
Description: define a new trigger
Syntax:
CREATE [ CONSTRAINT ] TRIGGER name { BEFORE | AFTER | INSTEAD OF } { event [ OR ... ] }
    ON table_name
    [ FROM referenced_table_name ]
    [ NOT DEFERRABLE | [ DEFERRABLE ] [ INITIALLY IMMEDIATE | INITIALLY DEFERRED ] ]
    [ REFERENCING { { OLD | NEW } TABLE [ AS ] transition_relation_name } [ ... ] ]
    [ FOR [ EACH ] { ROW | STATEMENT } ]
    [ WHEN ( condition ) ]
    EXECUTE { FUNCTION | PROCEDURE } function_name ( arguments )

where event can be one of:

    INSERT
    UPDATE [ OF column_name [, ... ] ]
    DELETE
    TRUNCATE

URL: https://www.postgresql.org/docs/13/sql-createtrigger.html

man beachte WHEN (...)
 
Zurück
Oben