Problemi con CASCADE

Ciao Gianni,

vorrei sapere come faccio ad esprimere questa cosa:

Se questa è lo stato della base di dati in un certo istante di tempo,

CORSI              STUDENTI                       ESAMI                      

|------------|     |------------|-----------|     |---------|-----------|    

| Cod_Laurea |     |   Cod_L    | Matricola |     |  Cod_L  | Cod_Esame |

|------------|     |------------|-----------|     |---------|-----------|

|   CL12     |     |   CL07     |566/000001 |     |   CL12  |   00101   |

|------------|     |------------|-----------|     |---------|-----------|

|   CL07     |     |   CL12     |566/000000 |     |   CL07  |   00101   |

|------------|     |------------|-----------|     |---------|-----------|

                   |   CL12     |566/000002 |     |   CL12  |   00100   |

                   |------------|-----------|     |---------|-----------|

                                                  |   CL07  |   00100   |

                                                  |---------|-----------|

ANNI                             PROPEDEUTICI                                           

|------------|-------|------|    |------------|-----------|----------|      

|   Cod_L    | Cod_E | Anno |    |   Cod_L    |  Cod_Esa  | Cod_Prop |

|------------|-------|------|    |------------|-----------|----------|     

|   CL12     | 00101 |  2   |    |   CL07     |   00100   |  00101   |

|------------|-------|------|    |------------|-----------|----------|

|   CL07     | 00101 |  1   |    |   CL12     |   00101   |  00100   |

|------------|-------|------|    |------------|-----------|----------|

|   CL12     | 00100 |  1   |    |   CL12     |   00101   |  00100   |

|------------|-------|------|    |------------|-----------|----------|

|   CL12     | 00100 |  2   |    |   CL12     |   00100   |  00101   |

|------------|-------|------|    |------------|-----------|----------|

perchè se elimino tramite phpmyadmin (quindi senza fare nessuna query, solo selezionando la tupla da esame e cliccando sul pulsante cancella)

la tupla "CL07 | 00101 |" (dalla tabella ESAMI),vengono eliminate dalla tabella ANNI anche la tupla "| CL12 | 00101", e vengono

eliminate tutte le tuple dalla tabella PROPEDEUTICI? Nelle altre tabelle tutto viene eliminato come dovrebbe.

Di seguito è riportata la definizione delle tabelle (funzionante) stando attento alle chiavi esterne (mi riferisco al discorso

sui capitoli,paragrafi ecc. da te spiegato ottimamente!):

CREATE TABLE CORSI

(

 Cod_Laurea CHAR(4) NOT NULL,

 Descrizione VARCHAR(70) NOT NULL,

 

 PRIMARY KEY(Cod_Laurea)

) ENGINE=INNODB;

CREATE TABLE STUDENTI

(

 Cod_L CHAR(4) NOT NULL,

 Matricola CHAR(10) NOT NULL,

 Nome VARCHAR(20) NOT NULL,

 Cognome VARCHAR(20) NOT NULL,

 Data_N DATE NOT NULL,

 Indirizzo VARCHAR(50) NOT NULL,

 Citta VARCHAR(50) NOT NULL,

 Telefono VARCHAR(15) NOT NULL,

 Sesso ENUM ('M','F') NOT NULL DEFAULT 'M',

 

 PRIMARY KEY (Matricola),

 FOREIGN KEY (Cod_L) REFERENCES CORSI(Cod_Laurea)

  ON DELETE CASCADE 

  ON UPDATE CASCADE

) ENGINE=INNODB;

CREATE TABLE ESAMI 

(

 Cod_L CHAR(4) NOT NULL,

 Cod_Esame INT(5) NOT NULL,

 Titolo VARCHAR(30) NOT NULL,

 CFU SMALLINT(2) NOT NULL,

 Tipo ENUM ('O','F') NOT NULL DEFAULT 'O',

 Anno ENUM('1','2','3'),

 PRIMARY KEY (Cod_L,Cod_Esame),

 FOREIGN KEY (Cod_L) REFERENCES CORSI(Cod_Laurea)

  ON DELETE CASCADE 

  ON UPDATE CASCADE,

 KEY Cod_Esame (Cod_Esame)  

) ENGINE=INNODB;

CREATE TABLE ANNI

(

 Cod_L CHAR(4) NOT NULL,

 Cod_E INT(5) NOT NULL,

 Anno ENUM('1','2','3') NOT NULL,

 PRIMARY KEY (Cod_L,Cod_E,Anno),

 FOREIGN KEY (Cod_L) REFERENCES CORSI(Cod_Laurea)

  ON DELETE CASCADE 

  ON UPDATE CASCADE,

 FOREIGN KEY (Cod_E) REFERENCES ESAMI(Cod_Esame)

  ON DELETE CASCADE

  ON UPDATE CASCADE

) ENGINE=INNODB;

CREATE TABLE PIANI 

(

 Mat CHAR(10) NOT NULL,

 Cod_L CHAR(4) NOT NULL,

 Cod_Esami INT(5) NOT NULL,

 Anno ENUM ('1','2','3') NOT NULL,

 Data_P DATE,

 Voto SMALLINT(2),

 Lode ENUM ('S','N') DEFAULT 'N',

 PRIMARY KEY (Cod_L,Mat,Cod_Esami),

 FOREIGN KEY (Cod_L) REFERENCES CORSI(Cod_Laurea)

  ON DELETE CASCADE

  ON UPDATE CASCADE,

 FOREIGN KEY (Mat) REFERENCES STUDENTI(Matricola)

  ON DELETE CASCADE

  ON UPDATE CASCADE,

 FOREIGN KEY (Cod_Esami) REFERENCES ESAMI(Cod_Esame)

  ON DELETE CASCADE

  ON UPDATE CASCADE

) ENGINE=INNODB;

CREATE TABLE PROPEDEUTICI

(

 Cod_L CHAR(4) NOT NULL,

 Cod_Esa INT(5) NOT NULL,

 Cod_Prop INT(5) NOT NULL, 

 PRIMARY KEY (Cod_L,Cod_Esa,Cod_Prop),

 FOREIGN KEY (Cod_L) REFERENCES CORSI(Cod_Laurea)

  ON DELETE CASCADE 

  ON UPDATE CASCADE,

 

 FOREIGN KEY (Cod_Esa) REFERENCES ESAMI(Cod_Esame)

  ON DELETE CASCADE

  ON UPDATE CASCADE,

 

 FOREIGN KEY (Cod_Prop) REFERENCES ESAMI(Cod_Esame)

  ON DELETE CASCADE

  ON UPDATE CASCADE

) ENGINE=INNODB;

Quindi io vorrei che fossero eliminati solo i riferimenti dalle tabelle, a proposito della tupla

"CL07 | 00101 |" e non tutte le tuple che fanno riferimento solo  a "00101".

Spero di essermi spiegato al meglio

GRAZIE

inviato 11 anni fa
noems
X 0 X

L'errore sta nel fatto che le tabelle ANNI e PROPEDEUTICI referenziano solo parte della chiave primaria di ESAMI.

Dovresti usare delle FK del tipo:

FOREIGN KEY (Cod_E, Cod_L) REFERENCES esami (Cod_Esame, Cod_L)

Dai un'occhiata a tutte le FK:

CREATE TABLE anni (
  Cod_L char(4) NOT NULL default '',
  Cod_E int(5) NOT NULL default '0',
  Anno enum('1','2','3') NOT NULL default '1',
  PRIMARY KEY  (Cod_L,Cod_E,Anno),
  KEY Cod_E (Cod_E,Cod_L),
  FOREIGN KEY (Cod_E, Cod_L) REFERENCES esami (Cod_Esame, Cod_L) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB;

CREATE TABLE corsi (
  Cod_Laurea varchar(4) NOT NULL default '',
  Descrizione varchar(70) NOT NULL default '',
  PRIMARY KEY  (Cod_Laurea)
) ENGINE=InnoDB;

CREATE TABLE esami (
  Cod_L varchar(4) NOT NULL default '',
  Cod_Esame int(5) NOT NULL default '0',
  Titolo varchar(30) NOT NULL default '',
  CFU smallint(2) NOT NULL default '0',
  Tipo enum('O','F') NOT NULL default 'O',
  Anno enum('1','2','3') default NULL,
  PRIMARY KEY  (Cod_L,Cod_Esame),
  KEY Cod_Esame (Cod_Esame),
  FOREIGN KEY (Cod_L) REFERENCES corsi (Cod_Laurea) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB;

CREATE TABLE piani (
  Mat char(10) NOT NULL default '',
  Cod_L char(4) NOT NULL default '',
  Cod_Esami int(5) NOT NULL default '0',
  Anno enum('1','2','3') NOT NULL default '1',
  Data_P date default NULL,
  Voto smallint(2) default NULL,
  Lode enum('S','N') default 'N',
  PRIMARY KEY  (Cod_L,Mat,Cod_Esami),
  KEY Mat (Mat),
  KEY Cod_Esami (Cod_Esami,Cod_L),
  FOREIGN KEY (Cod_Esami, Cod_L) REFERENCES esami (Cod_Esame, Cod_L) ON DELETE CASCADE ON UPDATE CASCADE,
  FOREIGN KEY (Mat) REFERENCES studenti (Matricola) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB;

CREATE TABLE propedeutici (
  Cod_L char(4) NOT NULL default '',
  Cod_Esa int(5) NOT NULL default '0',
  Cod_Prop int(5) NOT NULL default '0',
  PRIMARY KEY  (Cod_L,Cod_Esa,Cod_Prop),
  KEY Cod_Esa (Cod_Esa,Cod_L),
  KEY Cod_Prop (Cod_Prop,Cod_L),
  FOREIGN KEY (Cod_Prop, Cod_L) REFERENCES esami (Cod_Esame, Cod_L) ON DELETE CASCADE ON UPDATE CASCADE,
  FOREIGN KEY (Cod_Esa, Cod_L) REFERENCES esami (Cod_Esame, Cod_L) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB;

CREATE TABLE studenti (
  Cod_L varchar(4) NOT NULL default '',
  Matricola varchar(10) NOT NULL default '',
  Nome varchar(20) NOT NULL default '',
  Cognome varchar(20) NOT NULL default '',
  Data_N date NOT NULL default '0000-00-00',
  Indirizzo varchar(50) NOT NULL default '',
  Citta varchar(50) NOT NULL default '',
  Telefono varchar(15) NOT NULL default '',
  Sesso enum('M','F') NOT NULL default 'M',
  PRIMARY KEY  (Matricola),
  KEY Cod_L (Cod_L),
  FOREIGN KEY (Cod_L) REFERENCES corsi (Cod_Laurea) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB;

 :bye:

risposto 11 anni fa
Gianni Tomasicchio
X 0 X
Effettua l'accesso o registrati per rispondere a questa domanda