Unterpunkte beim Löschen von Elternelementen einbeziehen.

Hallo,

#1068 - Multiple primary key defined

die Fehlermeldung besagt nichts weiter, als dass es schon einen Primary Key auf deiner Tabelle "menu" gibt. Ich gehe mal davon aus, dass der Primary Key auf der Spalte "mid" liegt. Es kann nur einen Primärschlüssel pro Tabelle geben, daher die Fehlermeldung.

Und wie muss ich dann meine DB Abfrage abändern zum Löschen der Einträge?

Nichts, da den Rest die Datenbank selbst erledigt. D.h. ein einfaches
SQL:
DELETE FROM menu WHERE mid=29

löscht den Datensatz mit der mid=29, als auch die Datensätze, die über die Spalte "parent_id" hierarchisch damit verbunden sind.

Und was muss in die zusätzlichen Spalten an Werte rein?

Du brauchst keine zusätzlichen Spalten anlegen. Das was ich in den beiden ALTER-TABLE-Statements gemacht hab, war das Anlegen von Beschränkungen (Primärschlüssel und Fremdschlüssel). Diese Beschränkungen beziehen sich auf die Spalten "mid" und "parent_id", die in deiner Tabelle ja schon vorhanden sind.
Hier brauchst du also nichts weiter zu tun, ausser die Statements auzuführen.

Markus
 
Ok hört sich gut an.


SQL Eintrag ergab folgendes:

ALTER TABLE menu ADD CONSTRAINT pk_menu_id;# MySQL lieferte ein leeres Resultat zurück (d. h. null Zeilen).
ALTER TABLE menu ADD CONSTRAINT fk_parent_id FOREIGN KEY ( parent_id ) REFERENCES menu( mid ) ON DELETE CASCADE ;# MySQL lieferte ein leeres Resultat zurück (d. h. null Zeilen).

Tabelle sieht folgendermaßen aus, is das OK? Weil funktinieren tuts leider noch nicht.

CREATE TABLE `menu` (
`mid` int(11) NOT NULL auto_increment,
`eintrag` char(25) collate latin1_general_ci NOT NULL default '',
`parent_id` char(25) collate latin1_general_ci default NULL,
`href` char(50) collate latin1_general_ci NOT NULL default '',
`sortierung` int(11) NOT NULL,
PRIMARY KEY (`mid`),
KEY `fk_parent_id` (`parent_id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_general_ci AUTO_INCREMENT=327 ;

--
-- Daten für Tabelle `menu`
--

INSERT INTO `menu` VALUES (325, '1', 'NULL', '', 0);
INSERT INTO `menu` VALUES (326, '2', '325', '', 0);
 
Zuletzt bearbeitet:
Hallo,

ja, die Statements geben ja keine Werte zurück sondern legen einfach nur Beschränkungen auf die Tabelle.

Ein paar Sachen bleiben aber noch, die falsch sind:

1. Warum ist die ID-Spalte numerisch (INT(11)) und die parent_id-Spalte ein CHAR(25) ?

2. Der NULL den du in deinem INSERT-Statement angegeben hast, ist kein echter NULL, sondern der String "NULL". Das ist etwas anderes.

Richtig wäre:
SQL:
INSERT INTO `menu` VALUES (325, '1', NULL, '', 0);
also ohne die Anführungszeichen.


Was passiert denn in deinem Beispiel, wenn du den Datensatz mit der ID 325 versuchst zu löschen? Fehlermeldung? Wird nur ein Datensatz gelöscht? Was sagt der SELECT * from tabelle anschliessend?

Markus
 
Hallo,

mhm dann klingt es für mich, als "ON DELETE CASCADE" nicht aktiv ist für deinen Foreign Key, oder ob gar kein FOREIGN KEY aktiv ist.

Probier das ganze so wie ich es dir vorhin beschrieben habe aus mit einer anderen Tabelle, ob es damit geht. Bei mir gehts ohne Probleme.

Ich gehe davon aus, dass der FOREIGN KEY gar nicht angelegt wird, sonst könntest du nicht einfach den Datensatz herauslöschen und die
anderen bleiben stehen. Es müsste zumindest eine Fehlermeldung angezeigt werden.

Ich glaub ziemlich sicher, es liegt an dem Datentyp für deine PARENT_ID-Spalte. Ändere die mal folgendermassen ab (falls das jetzt noch geht):

SQL:
ALTER TABLE modify column parent_id INTEGER(11);

Und versuch dann _danach_ nochmal das hier:

SQL:
ALTER TABLE menu
  ADD CONSTRAINT fk_parent_id
    FOREIGN KEY (parent_id) REFERENCES menu (mid) ON DELETE CASCADE

Markus
 
Zuletzt bearbeitet:
Hallo,

Welche Version von MySQL verwendest du denn?
Ich habs mit 5.0 mal ausprobiert. Dort geht es.

Markus
 

Neue Beiträge

Zurück