Código
mysql> SELECT * FROM relacion; +------+--------+--------+ | id | codigo | nombre | +------+--------+--------+ | 1 | 2 | Luis | | 1 | 3 | Marta | | 2 | 4 | Jose | | 2 | 1 | Marian | +------+--------+--------+ 4 ROWS IN SET (0.00 sec) mysql> SELECT * FROM usuarios; +----+--------+ | id | nombre | +----+--------+ | 1 | Marian | | 2 | Luis | | 3 | Marta | | 4 | Jose | +----+--------+ 4 ROWS IN SET (0.00 sec)
Y yo quiero controlar que cuando actualize o elimine un dato de la tabla usuarios se aplique en la tabla relacion
justo como lo haria las tablas si usase un motor de almacenamiento transaccional como InnoDB, la diferencia es que
estas 2 tablas estan bajo el motor no transaccional Myisam... entonces como tu controlas esto? con la creacion de
triggers como te venia comentando:
Código
mysql> delimiter / mysql> CREATE TRIGGER trigo -> after UPDATE ON usuarios -> FOR each ROW -> BEGIN -> UPDATE relacion SET id = NEW.id WHERE id = OLD.id; -> END; -> / Query OK, 0 ROWS affected (0.06 sec) mysql> delimiter ; mysql> UPDATE usuarios SET id = 6 WHERE id = 1; Query OK, 1 ROW affected (0.04 sec) ROWS matched: 1 Changed: 1 Warnings: 0 mysql> SELECT * FROM relacion; +------+--------+--------+ | id | codigo | nombre | +------+--------+--------+ | 6 | 2 | Luis | | 6 | 3 | Marta | | 2 | 4 | Jose | | 2 | 1 | Marian | +------+--------+--------+ 4 ROWS IN SET (0.00 sec) mysql> SELECT * FROM usuarios; +----+--------+ | id | nombre | +----+--------+ | 6 | Marian | | 2 | Luis | | 3 | Marta | | 4 | Jose | +----+--------+ 4 ROWS IN SET (0.00 sec)
Viste como actualice data en la tabla usuarios y automaticamente se aplico en la tabla relacion
como si estuviesen bajo un motor de almacenamiento transaccional, cuando no lo esta?
Ahora si quisieras aplicar el 'ON DELETE CASCADE' por ejemplo que si eliminas una fila en
la tabla usuarios tambien se elimine de forma automatica en la tabla relacion.
Código
mysql> CREATE TRIGGER trigo1 -> after DELETE ON usuarios -> FOR each ROW -> BEGIN -> DELETE FROM relacion WHERE id = OLD.id; -> END; -> / Query OK, 0 ROWS affected (0.40 sec) mysql> delimiter ; mysql> DELETE FROM usuarios WHERE id = 2; Query OK, 1 ROW affected (0.00 sec) mysql> SELECT * FROM usuarios; +----+--------+ | id | nombre | +----+--------+ | 6 | Marian | | 3 | Marta | | 4 | Jose | +----+--------+ 3 ROWS IN SET (0.00 sec) mysql> SELECT * FROM relacion; +------+--------+--------+ | id | codigo | nombre | +------+--------+--------+ | 6 | 2 | Luis | | 6 | 3 | Marta | +------+--------+--------+ 2 ROWS IN SET (0.00 sec)
Lo anterior expuesto, no fuese posible de realizar sino existiera una relacion de identidad iguales de campos entre el campo ID de ambas tablas. Los datos no tienen que estas de manera obligatoria sobre tablas con motor InnoDB para poder funcionar (A nivel de relacion) como un motor transaccional lo haria. Pero especifico a nivel de relacion de campos no al nivel de todas las funcionalidades que posee un motor transaccional real como son los indices clustered en vez de b-tree, el lockeo de filas en vez de toda la tabla, entre otras cositas internas que poseen los motores transaccionales que no sera aplicable en motores no transaccionales, pero... en el caso que pides no es requerido exponer esto ni abundar tanto, lo que pides se puede controlar con TRIGGERS en motores no transaccionales como puedes ver... y obviamente asi como controlas que campos se actualizan y eliminan de la tabla relacion cuando hacemos algo en la tabla usuarios, puedes crear TRIGGERS que impidan que se actualice o elimine campos sobre relacion sino se ha aplicado nada en la tabla usuarios.