sql >> Databasteknik >  >> RDS >> Mysql

Simulera en DELETE CASCADE i MySQL?

Du kan göra en kopia av databasen och sätta triggers på 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 ;

Loggtabellen är bara en tabell med följande fält:

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

Om du gör en SELECT @last_id:= max(id) FROM log före raderingskaskaden på kopian.
Då kan du göra en SELECT * FROM log WHERE id > @last_id
och hämta alla rader som kommer att raderas i kaskaden.

Efter det kan du använda restore_table1 för att återskapa raderna som raderades i kaskaden i kopieringsdatabasen.



  1. Har Mysql 5 procedurer för att hantera hierarkiska data?

  2. Jag har md5-krypterat lösenord, hur ger man lösenordet till användaren när han använder Glömt lösenordet?

  3. Hur tar man bort dubbletter av objekt i MySQL med en datauppsättning på 20 miljoner rader?

  4. Biblioteket har inte laddats:libmysqlclient.16.dylib fel vid försök att köra 'rails server' på OS X 10.6 med mysql2 gem