2011-01-07 2 views
1

Ich habe eine MySQL-Tabelle wie folgt aus:PHP, MySQL, Kategorien und Unterkategorien - Das Löschen

CREATE TABLE categories 
(
     ID INT NOT NULL, 
     Name VARCHAR(100) NULL, 
     Parent INT NULL, 
     PRIMARY KEY (ID) 
)Engine=InnoDB 

Was ich möchte, ist das Löschen aller Kinder tun, sicherzustellen, wenn ein Elternteil gelöscht wird. Zuerst wollte ich es tun, indem ich einen Fremdschlüssel wie den der Tabelle hinzufügte:

ALTER TABLE categories ADD CONSTRAINT FOREIGN KEY Parent(Parent) 
REFERENCES categories(ID) ON DELETE CASCADE 

Das funktioniert nicht. Ich habe auch interne Beziehungen versucht, aber ohne Erfolg.

Eltern und ihre Kinder sind mit einer rekursiven PHP-Funktion verknüpft. Gibt es einen Weg in MySQL, um das Ziel zu erreichen, oder sollte es mit PHP gemacht werden?

Antwort

1

Arbeiten für mich.

#Server version: 5.1.42-community MySQL Community Server (GPL) 
create table lists(
    id int not null 
    ,parent int 
    ,primary key(id) 
    ,foreign key(parent) references lists(id) on delete cascade 
) Engine=InnoDb; 

insert into lists(id, parent) values(1, null); 
insert into lists(id, parent) values(2, 1); 
insert into lists(id, parent) values(3, 2); 
insert into lists(id, parent) values(4, 3); 

mysql> select * from lists; 
+----+--------+ 
| id | parent | 
+----+--------+ 
| 1 | NULL | 
| 2 |  1 | 
| 3 |  2 | 
| 4 |  3 | 
+----+--------+ 
4 rows in set (0.00 sec) 

mysql> 
mysql> delete from lists where id = 1; 
Query OK, 1 row affected (0.02 sec) 

mysql> 
mysql> select * from lists; 
Empty set (0.00 sec) 
2

Sie haben den Fremdschlüssel anders herum definiert.
Sie sollten es definieren als:

ALTER TABLE categories ADD CONSTRAINT FOREIGN KEY (id) 
REFERENCES Parent(Parent) ON DELETE CASCADE 
0

Sie so etwas wie dieses benötigen:

drop table if exists categories; 
create table categories 
(
cat_id int unsigned not null auto_increment primary key, 
name varchar(255) not null, 
parent_id int unsigned null, 
foreign key (parent_id) references categories(cat_id) on delete cascade 
) 
engine = innodb; 
0

Ronnis, Foo, du hast Recht. Es funktioniert wirklich. :-)

Die Sache, die ich falsch machte, war "0" für die erste Eltern über meine PHP-Anwendung. Natürlich, wenn ich "0" setze (es gibt kein Elternteil mit der ID "0"), verstoße ich gegen die Fremdschlüsselregeln. Also musste ich meine INSERT-Anweisung nur ein wenig bearbeiten. Vielen Dank, dass Sie mich darauf aufmerksam gemacht haben. Danke an alle!

Verwandte Themen