• User Newbie

    ON DELETE CASCADE MySQL

    Salve a tutti...non capisco perchè, non riesco a capire come mai non mi funziona l'evento ON DELETE CASCADE quando creo una chiave esterna su una tabella. Con un esempio sarà più facile.

    Diciamo di creare queste due tabelle:

    CREATE TABLE utenti (nome VARCHAR(20), cognome VARCHAR(20), id INT(255) AUTO_INCREMENT PRIMARY KEY)

    CREATE TABLE messaggi (testo VARCHAR(255), mid INT(255) AUTO_INCREMENT PRIMARY KEY, uid INT(255), FOREIGN KEY messaggi (uid) REFERENCES utenti (id) ON DELETE CASCADE)

    diciamo di avere un utente con id = 1, e avere nella tabella messaggi tre messaggi con uid = 1, quindi, in teoria, scritti dall'utente con id = 1...nel caso in cui io cancelli dalla tabella utenti l'utente con id=1, non mi si dovrebbero cancellare tutti e tre i messaggi presenti nella tabella messaggi con uid=1 data la presenza della chiave esterna con ON DELETE CASCADE?


  • Super User

    ciao,sì, dovrebbe funzionare come dici tu...

    occhio però che mi pare (così a naso) che ci sia una virgola di troppo prima della istruzione "FOREIGN KEY!

    **uid INT(255), FOREIGN KEY

    **prova a levarla...(sono più ferrato su SQLServer,ma la sintassi dovrebbe essere la stessa...più o meno...)


  • User Newbie

    Ho scoperto dov'era l'errore. La sintassi è corretta. Quella virgola può essere levata però la sintassi diventa lievemente diversa (tipo id INT(255) FOREIGN KEY REFERENCES utenti (id), o una cosa del genere). Il problema era tutt'altro! Io uso Xampp, e per far funzionare i vincoli di chiavi esterne l'ENGINE del database deve essere InnoDB. Per fare ciò bisogna editare il file my dentro la cartella xampp/mysql/bin, decommentando tutte le linee sotto l'area skip InnoDB e commentare la stessa riga skip-InnoDB fino ad ottenere ciò:

    #skip-innodb

    Uncomment the following if you are using InnoDB tables

    innodb_data_home_dir = C:/Programmi/xampp/mysql/data/
    innodb_data_file_path = ibdata1:10M:autoextend
    innodb_log_group_home_dir = C:/Programmi/xampp/mysql/data/
    innodb_log_arch_dir = C:/Programmi/xampp/mysql/data/

    You can set .._buffer_pool_size up to 50 - 80 %

    of RAM but beware of setting memory usage too high

    set-variable = innodb_buffer_pool_size=16M
    set-variable = innodb_additional_mem_pool_size=2M

    Set .._log_file_size to 25 % of buffer pool size

    set-variable = innodb_log_file_size=5M
    set-variable = innodb_log_buffer_size=8M
    innodb_flush_log_at_trx_commit=1
    set-variable = innodb_lock_wait_timeout=50

    a questo punto sarà necessario terminare ogni query relativa alla creazione di nuove tavole con vincoli di chiave esterna con type=InnoDB