2016-07-24 21 views
3

Ich versuche, einen Trigger zu erstellen, der unter bestimmten Bedingungen NACH einem UPDATE bei Tabellen beginnt, die mit einer bestimmten Zeichenfolge wie "beginnen A_ "zum Beispiel.So erstellen Sie einen Trigger, der nach dem Update nur für Tabellen ausgelöst wird, die mit "Table_" beginnen

CREATE TABLE `Table_TEST` (
    `id` INT(11) NULL DEFAULT NULL, 
    `A` INT(11) NULL DEFAULT NULL, 
    `B` INT(11) NULL DEFAULT NULL, 
    `C` INT(11) NULL DEFAULT NULL 
) 
COLLATE='utf8_unicode_ci' 
ENGINE=InnoDB 
; 

Der Trigger sollte die Summe (Spalte „A“) minus SUM (Spalte „B“) stellt bis zum Index der Zeile, die aktualisiert wurde, und schreibt diese Summe in der Spalte „C“ in dieser Zeile.

CREATE DEFINER=`root`@`localhost` 
TRIGGER `Table_TEST_before_insert` BEFORE UPDATE ON `Table_TEST` FOR EACH ROW 
BEGIN 
SET new.C = (SUM(new.A)-SUM(new.B)); 
END 

Dieser Trigger funktioniert nicht und bringt dieses Scheitern

UPDATE `Testdb`.`Table_TEST` SET `b`='4' WHERE `id`=1 LIMIT 1; 
/* SQL Fehler (1111): Invalid use of group function */ 

Danach sollten sie alle anderen Werte in Spalte „C“ aktualisieren die nach der gegebenen Formel bis zu, dass nach diesem Index kommen jeweiliger Index.

Gerade habe ich eine Funktion in PHP geschrieben, die ich nach jedem Update in der Datenbank in meinem PHP-Skript anfügen. Aber es ist in der Tat nicht was ich will.

Ich möchte dies als Routine/Trigger.

Was habe ich versucht, sieht wie folgt aus, aber darüber im Klaren sein, dass es nicht

CREATE DEFINER=`root`@`localhost` 
TRIGGER `TABLE_1_before_update` BEFORE UPDATE ON `TABLE_1` FOR EACH ROW 
BEGIN 
SET new.C = (SUM(new.A)-SUM(new.B)) WHERE id=NEW.id; 
END 
Arbeits

The Failure ich erhalte, ist: SQL Fehler (1064): Sie haben einen Fehler in der SQL-Syntax; Überprüfen Sie das Handbuch, das Ihrer MySQL-Serverversion entspricht, nach der richtigen Syntax für die Verwendung in der Nähe von 'WHERE id = NEW.id; ENDE bei Zeile 2

Können Sie mir bitte helfen?

Antwort

1

Nun, ich denke, Sie können die Tabellen auswählen und dann tun Sie Ihren Auslöser.

SELECT `TABLE_NAME` 
    FROM information_schema.tables 
WHERE table_schema='<your-database-name>' 
    AND `TABLE_NAME` LIKE 'a%' 

EDIT:

Nicht getestet, aber das könnte auch funktionieren (wenn nicht, nur die Tabellennamen wählen mit der vorherige Abfrage und dann jeweils Trigger erstellen, wie ich schon sagte).

CREATE 
DEFINER=`user`@`localhost` 
TRIGGER `trigger_name` AFTER UPDATE 
ON (
    SELECT `TABLE_NAME` 
     FROM information_schema.tables 
    WHERE table_schema='<your-database-name>' 
     AND `TABLE_NAME` LIKE 'a%' 
) FOR EACH ROW 

BEGIN 
    SET new.C = (SUM(new.A)-SUM(new.B)) WHERE id=NEW.id; 
END 

Hinweis: Stellen Sie sicher,<your-database-name> für Ihren Datenbanknamen zu ersetzen.

+0

SQL Fehler 1362: Aktualisierung der neuen Zeile ist nicht erlaubt in nach Trigger –

+0

, dann habe ich es auf VOR UPDATE.: SQL Fehler (1064): Sie haben einen Fehler in Ihrer SQL-Syntax; Überprüfen Sie das Handbuch, das Ihrer MySQL-Serverversion entspricht, nach der richtigen Syntax für die Verwendung in der Nähe von 'WHERE id = NEW.id; END 'at line 2 */ –

+1

Nun ... Ich war mir nicht sicher über das AFTER UPDATE (wie ich schon sagte, als ich es gepostet habe), aber das VOR UPDATE sollte funktionieren. Wie Sie in der Fehlermeldung sehen, ist es ein Syntaxfehler auf dem Teil, den Sie hinzugefügt haben. Überprüfe deine Syntax oder poste deinen Code, wenn ich (und andere) es überprüfen und helfen soll. –

0

Ein Trigger gehört zu einer bestimmten Tabelle. Sie müssen manuell einen Trigger zu jeder Tabelle hinzufügen, die überwacht werden soll (in Ihrem Fall jede Tabelle, deren Name mit 'A' beginnt).

Dokumentation: CREATE TRIGGER Syntax

Ihre Anforderungen scheinen seltsam für mich. Es ist ziemlich ungewöhnlich, Daten nur für Tabellen zu aktualisieren, deren Name einem Filter entspricht. Sind Sie sicher, dass Sie Ihre Datenbankstruktur nicht reorganisieren können und die Daten für alle "A *" - Tabellen in einer einzigen Tabelle zusammengeführt haben?

+0

Vielen Dank für den Kommentar. Es gibt Leistungsgründe, warum ich das wähle. Okay, ich habe es verstanden, dann können wir über den zweiten Teil der Frage sprechen. –