¿Cómo actualizar en cascada en MySQL?

Veamos esta database de ejemplo: Ejemplo de base

Como podemos ver, la persona depende de la ciudad (person.city_id es una key externa). No borro filas, simplemente las configuré inactivas (activas = 0). Después de configurar la ciudad inactiva, ¿cómo puedo configurar automáticamente a todas las personas que dependen de esta ciudad inactivas? ¿Hay alguna manera mejor que escribir triggers?

EDITAR: solo estoy interesado en establecer filas de personas inactivas, no configurándolas activas.

Aquí hay una solución que usa keys externas en cascada para hacer lo que describes:

mysql> create table city ( id int not null auto_increment, name varchar(45), active tinyint, primary key (id), unique key (id, active)); mysql> create table person ( id int not null auto_increment, city_id int, active tinyint, primary key (id), foreign key (city_id, active) references city (id, active) on update cascade); mysql> insert into city (name, active) values ('New York', 1); mysql> insert into person (city_id, active) values (1, 1); mysql> select * from person; +----+---------+--------+ | id | city_id | active | +----+---------+--------+ | 1 | 1 | 1 | +----+---------+--------+ mysql> update city set active = 0 where id = 1; mysql> select * from person; +----+---------+--------+ | id | city_id | active | +----+---------+--------+ | 1 | 1 | 0 | +----+---------+--------+ 

Probado en MySQL 5.5.31.

Tal vez deberías reconsiderar cómo defines a una persona para que esté activa. En lugar de tener activada la definición dos veces, solo debes mantenerla en la tabla de la ciudad y hacer que tus declaraciones SELECT devuelvan Persona WHERE city.active = 1 …

Pero si debes … podrías hacer algo como:

 UPDATE city C LEFT JOIN person P ON C.id = P.city SET C.active = 0 AND P.active = 0 WHERE C.id = @id