sql >> Database >  >> RDS >> Mysql

Een DELETE CASCADE simuleren in MySQL?

U kunt een kopie van de database maken en triggers op de after delete . zetten

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 ;

De logtabel is slechts een tabel met de volgende velden:

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

Als je een SELECT @last_id:= max(id) FROM log . doet vóór de verwijdercascade op de kopie.
Dan kun je een SELECT * FROM log WHERE id > @last_id doen
en krijg alle rijen die in de cascade worden verwijderd.

Daarna kunt u de restore_table1 gebruiken om de rijen die in de cascade zijn verwijderd, opnieuw te maken in de kopieerdatabase.



  1. DATEDIFF-functie in Oracle

  2. Hoe u de huidige datum (zonder tijd) in T-SQL kunt krijgen

  3. Een MySQL-database converteren naar UTF-8-codering

  4. Ruimtelijke gegevens in PostgreSQL