Visualizzazione dei risultati da 1 a 6 su 6
  1. #1
    Moderatore di PHP L'avatar di Alhazred
    Registrato dal
    Oct 2003
    Messaggi
    12,445

    [MYSQL] On delete cascade

    Sto provando ad usare la clausola "on delete cascade" su due tabelle in modo da manterere i dati consistenti nel caso venisse cancellata una riga in una delle due tabelle.
    La creazione delle tabelle l'ho fatta così:
    codice:
    create table Conto (
    	numeroConto 	int	 	not null auto_increment,
    	saldo		float(2)	default 0,
    	primary key (numeroConto)
    )
    engine=innodb;
    
    create table Possiede (
    	Cliente		varchar(10)	primary key,
    	Conto		int		not null auto_increment,
    	Key (conto)
    )
    engine=innodb;
    
    
    alter table conto add constraint possiede_delete foreign key (numeroconto) references possiede(conto) on delete cascade;
    alter table possiede add constraint conto_delete foreign key (conto) references conto(numeroconto) on delete cascade;
    Nel momento in cui provo ad inserire una riga nella tabella conto appare questo messaggio d'errore:
    Cannot add or update a child row: a foreign key constraint fails (`ricettelastminute`.`conto`, CONSTRAINT `possiede_delete` FOREIGN KEY (`numeroConto`) REFERENCES `possiede` (`Conto`) ON DELETE CASCADE)
    Cosa analoga se l'inserimento lo provo nella tabella possiede, cambia solo l'alter table che mi visualizza dopo "Cannot add or update a child row: a foreign key constraint fails".

    Da cosa dipende? come faccio a far funzionare "on delete cascade"?

  2. #2
    Potresti fornire lo schema e/r o uml della base di dati ?
    Experience is what you get when you don’t get what you want

  3. #3
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,304
    Credo che tu abbia un problema con la struttura ER del tuo DB:
    Se la tabella A ha un campo che è chiave esterna di una tabella B, la tabella B non può avere un campo che è chiave esterna della tabella A.

    Per inserire un record nella tabella A, infatti, deve esserci un record corrispondente nella tabella B... ma nella tabella B non puoi inserire record senza averne di corrispondenti nella tabella A... è un circolo vizioso.

    la clausola FOREIGN KEY definisce una relazione di "padre" e "figlio" fra due tabelle in cui ciascun record della tabella FIGLIO deve avere un corrispondente record nella tabella padre.


    In buona sostanza, devi rivedere la definizione di quelle tabelle.


    PS: la clausola ON DELETE CASCADE si riferisce proprio a questa relazione e significa "se rimuovo un record dalla tabella PADRE, allora rimuovi tutti i record correlati nella tabella FIGLIO" e, come puoi ben capire, non può essere biunivoca (senza che ci sia almeno una terza tabella fra le due).

    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  4. #4
    Credo abbia fatto una associazione 1 a 1 (che si traduce con una sola tabella)
    Experience is what you get when you don’t get what you want

  5. #5
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,304
    Originariamente inviato da Xaratroom
    Credo abbia fatto una associazione 1 a 1 (che si traduce con una sola tabella)
    Certo... ma ha creato due tabelle con vincolo di chiave esterna tra di esse, invece di farne una sola...:

    codice:
    alter table conto add constraint possiede_delete foreign key (numeroconto) references possiede(conto) on delete cascade;
    alter table possiede add constraint conto_delete foreign key (conto) references conto(numeroconto) on delete cascade;

    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  6. #6
    Moderatore di PHP L'avatar di Alhazred
    Registrato dal
    Oct 2003
    Messaggi
    12,445
    Eh già... no, lo schema ER è corretto, sono io che ho fatto casino scrivendo le Foreign Key, ne ho un po' e scrivendo non mi sono reso conto che quelle due erano incrociate... nemmeno isolandole per scriverle qui
    Vabbè... grazie per avermelo fatto notare

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.