Pregunta

Tengo una tabla de MySQL como esto:

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

Lo que me gustaría hacer es garantizar la eliminación de todos los niños cada vez que un padre se elimina. Al principio, quería hacerlo mediante la adición de una clave externa al igual que a la tabla:

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

Esto no funciona. También he intentado relaciones internas, pero sin éxito.

Los padres y sus hijos están vinculados con una función recursiva PHP. ¿Hay alguna manera en MySQL para lograr el objetivo, o se debe hacer con PHP?

¿Fue útil?

Solución

funciona para mí.

#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)

Otros consejos

Ha definido la clave externa a la inversa.
Debe definir como:

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

se necesita algo como esto:

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;

Ronnis, Foo, tienes razón. Realmente funciona. :-)

Lo que estaba haciendo mal estaba poniendo "0" para el primer padre a través de mi aplicación PHP. Por supuesto, si pongo "0" (no hay ningún padre con el id "0"), entonces yo estoy violando las normas de clave externa. Por lo tanto, todo lo que tenía que hacer era modificar mi instrucción INSERT un poco. Gracias mucho por traer esto a mi atención. Gracias a todos!

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top