Erstellen eines Triggers verursacht fehler - Code von mysql.com.

jmar83

SQL-Guru
Beiträge
146
Hallo zusammen

Dieser Code ist unter mysql.com zu finden:

Code:
CREATE TRIGGER insert_myisam_child
BEFORE INSERT
ON myisam_child
FOR EACH ROW
BEGIN
IF (SELECT COUNT(*) FROM myisam_parent WHERE mparent_id=new.mparent_id)=0
THEN
INSERT error_msg VALUES ('Foreign Key Constraint Violated!');
END IF;
END;


(https://dev.mysql.com/tech-resources/articles/mysql-enforcing-foreign-keys.html)


Auf meine Bedürfniusse angepasst sieht er so aus:


Code:
CREATE TRIGGER insert_adressen
  BEFORE INSERT
  ON adressen
  FOR EACH ROW
  BEGIN
  
  IF (SELECT COUNT(*) FROM adressen WHERE adr_id=new.adr_id)=0
  THEN
  INSERT error_msg VALUES ('Foreign Key Constraint Violated!');
  END IF;
  
  END;


Die Tabelle "adressen" und das Feld "adr_id" existiert.

TRotzdem kommt immer diese Meldung ohne Aussagekraft:

" #1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '' at line 8 "


Grüsse, Jan
 
Zuletzt bearbeitet von einem Moderator:
Werbung:
Hallo akretschmer
Ist zwar nicht das Thema, aber ich habe schon meinen Grund, der Problem nennt sich "MyISAM"
Oder kann ich eine MyISAM-Tabelle nach InnoDB umwandeln?

Gruss, Jan
 
Als Frontend verwende ich "HeidiSQL", dabei ist mir aufgefallen dass ich manchmal ein Semikolon setzen muss was normalerweise (?) nicht der Fall ist.
Hier bei meinem Trigger weiss ich allerdings nicht wo..?
Nachtrag: in phpmyadmin geht's auch nciht...
GRüsse, Jan
 
insert benötigt meines Wissens ein 'to', ich denke mal, das wird auch in MyZettelkasten so sein. Das Beispiel in der Doku bezieht sich auf 2 Tabellen, Du willst das in einer machen. Und ja, ersetz am Besten nicht nur MyISAM mit was anderen, sondern gleich MySQL mit einer richtigen DB.
 
Das Problem scheint in diesem Abschnitt zu sein:

use adressql;
IF (SELECT COUNT(*) FROM adressen)=0
SELECT "A"
END IF;


Fehler von heidisql:

/* SQL Fehler (1064): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'IF (SELECT COUNT(*) FROM adressen)=0
SELECT "A"
END IF' at line 1 */
/* Affected rows: 0 Gefundene Zeilen: 0 Warnungen: 0 Dauer von 1 of 2 queries: 0,000 sec. */



Fehler von pma:

Fehler
SQL-Befehl:

IF( SELECT COUNT( * )
FROM adressen ) =0
SELECT "A"
END IF ;

MySQL meldet:

#1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'IF (SELECT COUNT(*) FROM adressen)=0
SELECT "A"
END IF' at line 1
 
Dieser Befehl geht aber "alleine":

SELECT COUNT(*) FROM adressen


?????

wie soll ich bitte denn das "if" anders formulieren als auf der mysql-seite angegeben, wtf!!?
 
finde den Unterschied!

Code:
test=*# select 'A';
 ?column?
----------
 A
(1 row)

test=*# select "A";
ERROR:  column "A" does not exist
LINE 1: select "A";
 
nix geht:

use adressql;
IF (SELECT COUNT(*) FROM "adressen")=0
SELECT "A"
END IF;

use adressql;
IF (SELECT COUNT(*) FROM 'adressen')=0
SELECT 'A'
END IF;

use adressql;
IF (SELECT COUNT(*) FROM 'adressen')=0
SELECT "A"
END IF;

use adressql;
IF (SELECT COUNT(*) FROM "adressen")=0
SELECT 'A'
END IF;

use adressql;
IF (SELECT COUNT(*) FROM `adressen`)=0
SELECT `A`
END IF;

use adressql;
IF (SELECT COUNT(*) FROM "adressen")=0
SELECT `A`
END IF;

use adressql;
IF (SELECT COUNT(*) FROM 'adressen')=0
SELECT `A`
END IF;
 
auch nix:

use adressql;
IF (SELECT COUNT(*) FROM adressen)=0
SELECT 0
END IF;

use adressql;
IF (SELECT COUNT(*) FROM "adressen")=0
SELECT 0
END IF;

use adressql;
IF (SELECT COUNT(*) FROM 'adressen')=0
SELECT 0
END IF;

use adressql;
IF (SELECT COUNT(*) FROM `adressen`)=0
SELECT 0
END IF;
 
Ich glaube ich "löse" das Problem auf PHP-Ebene, nur einfügen falls Teilmenge von... da FK un PK in der gleichen Tabelle sind und zusammen einen Tree repräsentieren.

Der FK darf entweder null sein oder wie gesagt Teilmenge aller PK's sein.
 
Werbung:
Ich glaube ich "löse" das Problem auf PHP-Ebene

DB-Aufgaben in der Applikation zu lösen ist ein guter und schneller Weg in vielfältige Probleme. Eines Deiner nächsten Probleme wird dann vermutlich die rekursive Abfrage Deines Baumes sein.

Ich kann Dir nur empfehlen, gleich eine DB zu nehmen, die das alles richtig kann, noch bevor der Beton Deiner Baustelle aushärtet.
 
Zurück
Oben