在MySQL中模拟DELETE CASCADE?

use*_*971 14 mysql cascading-deletes

是否可以自动预测DELETE CASCADE后面的操作?在我的软件中,我想向用户发出警告,其中包含有关将被删除的数据的详细信息.

Joh*_*ica 4

您可以制作数据库的副本并将触发器放在after delete

DELIMITER $$

CREATE TRIGGER ad_table1_each AFTER DELETE ON table1 FOR EACH ROW
BEGIN
  INSERT INTO log VALUES (null                 /*autoinc id*/
        , 'table1'                             /*tablename*/
        , old.id                               /*tableid*/
        , concat_ws(',',old.field1,old.field2  /*CSV's of fields*/
        , NOW()                                /*timestamp*/
        , 'delete');                           /*what action*/


  REPLACE INTO restore_table1 VALUES (old.id,
        , old.field1
        , old.field2
        , ... );

END $$

DELIMITER ;
Run Code Online (Sandbox Code Playgroud)

日志表只是一个包含以下字段的表:

id            integer autoincrement primary key
tablename     varchar(45)
table_id      integer
fields        varchar(6000)
delete_time   timestamp
action        enum('insert','update','delete')
Run Code Online (Sandbox Code Playgroud)

如果您SELECT @last_id:= max(id) FROM log在副本上进行删除级联之前。
然后你可以执行 aSELECT * FROM log WHERE id > @last_id
并获取级联中将删除的所有行。

之后,您可以使用restore_table1在副本数据库中重新创建级联中删除的行。