Violazione dei vincoli di integrità

Salve a tutti.

Dopo aver creato le tabelle di tipo InnoDb contenenti chiavi esterne ho notato che se uso la notazione 'on update cascade' riferita ad un attributo chiave,allora la modifica non viene apportata!Come si può fare per risolvere il problema?

Attendo una vostra risposta.

inviato 10 anni fa
flaky
X 0 X

puoi fare un esempio?

risposto 10 anni fa
Gianni Tomasicchio
X 0 X

Certo ti faccio un esempio.

create table FILM

(

     Titolo           varchar(50)  primary key    not null,

     Genere         varchar(20)          not null,

     Anno_prod      date                   not null,

     Regista         varchar(30)          not null,

     Attore           varchar(30)          not null

) TYPE=InnoDB;

create table PROIEZIONE

(

       Codicepr       int(3)           not null,

       Film            varchar(50)    not null

                                              references FILM(Titolo)

                                                      on update cascade,

      Data_pr                date          not null,

       Ora_inizio            time          not null,

       primary key(Codicepr,Film)

) TYPE=InnoDB;

Quello che mi succede è questo:

se in proiezione 'Film' è chiave primaria,allora quando nella tabella FILM vado a modificare un Titolo,nella tabella proiezione lo stesso titolo non viene modificato.

SE invece film non è chiave primaria,invece funziona.

IO mi trovo nel caso che nella tabella proiezione sia Codpr che Film sono chiavi primarie.

Esempio:

Tabella film

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

   Titolo

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

     Ciao

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

       Mondo

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

Tabella poiezione

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

   Codpr                 Film

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

       101              Ciao

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

        102              Mondo

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

Quando effettuo  update FILM set Titolo='Come stai? ' where Titolo ='Ciao'

nella tabella FILM

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

   Titolo

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

     Come stai?

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

       Mondo

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

Mentre la tabella PROIEIZONE RIMANE INALTERATA,CIOè;

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

   Codpr                 Film

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

       101              Ciao

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

        102              Mondo

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

risposto 10 anni fa
flaky
modificato 10 anni fa
X 0 X

Credo che il problema sia causato dal fatto che "Film" non è il primo campo della chiave "Codicepr,Film"

Comunque dai un'occhiata alla documentazione ufficiale:

http://dev.mysql.com/doc/refman/4.1/en/innodb-foreign-key-constraints.html

 :bye:

risposto 10 anni fa
Gianni Tomasicchio
X 0 X

Ho provato a mettere Film come prima chiave di Proiezione(Film,Codpr),ma il risultato non cambia.Non mi cmabia il valore nella tabella Proiezione quando lo modifico in FILM.

Funziona solo se non è chiave primaria.

Grazie cmq dell'aiuto.Ciao

risposto 10 anni fa
flaky
X 0 X

Sono riuscito a risolvere il problema.

risposto 10 anni fa
flaky
X 0 X
Sono riuscito a risolvere il problema.

Ovvero?

risposto 10 anni fa
Gianni Tomasicchio
X 0 X

Dopo aver fatto vari tentativi,alla fine ho ottenuto che se scrivo ad esempio

create table proiezione

(

    Codpr decimal(3) not null,

    Film varchar(50) not null references film(Titolo) on update cascade,

    primary key(Codpr,Film)

)TYPE=InnoDB;

create table film( Titolo varchar(50) not null primary key);

allora se in film cambio il valore dell'attributo Titolo,tale valore poi non viene di conseguenza cambiato nella tabella proiezione.Ossia:

   TABLE film                        TABLE proiezione

+-------------+                +------------+-----------------+

      Titolo                            Codpr         Film

+-------------+                +------------+-----------------+     

       Ciao                            101            Ciao

+-------------+                +------------+-----------------+

Se dal prompt dei comandi di mysql scrivi:

         update film set Titolo='Hello!' where Titolo='ciao'

come risultato si ottiene:

   TABLE film                        TABLE proiezione

+-------------+                +------------+-----------------+

      Titolo                            Codpr         Film

+-------------+                +------------+-----------------+     

       Hello!                            101         Ciao

+-------------+                +------------+-----------------+

Se invece:

 create table proiezione

(

    Codpr decimal(3) not null,

    Film varchar(50) not null

    primary key(Codpr,Film),

    foreign key (Film) references film(Titolo) on update cascade

)TYPE=InnoDB;

create table film( Titolo varchar(50) not null primary key);

allora in entrambe le tabelle viene modificato il titolo del film,ossia:

  TABLE film                        TABLE proiezione

+-------------+                +------------+-----------------+

      Titolo                            Codpr         Film

+-------------+                +------------+-----------------+     

       Ciao                            101            Ciao

+-------------+                +------------+-----------------+

Se dal prompt dei comandi di mysql scrivi:

         update film set Titolo='Hello!' where Titolo='ciao'

come risultato si ottiene:

   TABLE film                        TABLE proiezione

+-------------+                +------------+-----------------+

      Titolo                            Codpr         Film

+-------------+                +------------+-----------------+     

       Hello!                            101         Hello!

+-------------+                +------------+-----------------+

Spero di essere stata chiara nella spiegazione.

Ciao

risposto 10 anni fa
flaky
X 0 X

Ciao

ho creato quetse due tabelle:

CREATE TABLE `proiezione` (

`Codpr` INT UNSIGNED NOT NULL ,

`Film` VARCHAR( 50 ) NOT NULL ,

`Codsala` INT UNSIGNED NOT NULL ,

`IDcinema` CHAR( 2 ) NOT NULL ,

`Data_pr` DATE NOT NULL ,

`Ora_inizio` TIME NOT NULL ,

PRIMARY KEY ( `Codpr` , `Film` , `Codsala` , `IDcinema` ) ,

INDEX ( `Codpr` ) ,

INDEX ( `Film` ) ,

INDEX ( `Codsala` ) ,

INDEX ( `IDcinema` ) ,

FOREIGN KEY ( `Film` ) REFERENCES film( Titolo ) ON UPDATE CASCADE ,

FOREIGN KEY ( `IDcinema` ) REFERENCES cinema( IDcinema ) ,

FOREIGN KEY ( `Codsala` ) REFERENCES sala( Codsala )

) TYPE = InnoDB;

CREATE TABLE `film` (

`Titolo` VARCHAR( 50 ) NOT NULL ,

`Genere` VARCHAR( 20 ) NOT NULL ,

`Anno_prod` DATE NOT NULL ,

`Regista` VARCHAR( 30 ) NOT NULL ,

`Attore` VARCHAR( 30 ) NOT NULL ,

PRIMARY KEY ( `Titolo` )

) TYPE = InnoDB;

Ho inserito dei valori nella tabella film.

Quando sono andato ad inserire dei dati nella,invece di inserirmeli,mi ha dato il seguente errore:

         Cannot add or update a child row:a foreign key constraint fails.

Non so come risolvere il problema.

risposto 10 anni fa
flaky
modificato 10 anni fa
X 0 X

significa che i dati che hai inserito non rispettano i vincoli di integrità che hai imposto.

risposto 10 anni fa
Gianni Tomasicchio
X 0 X

Ma questo lo avevo già capito.Ora devo capire solo perchè non sono rispettati... :dunno:

risposto 10 anni fa
flaky
X 0 X

Se non riporti la INSERT che hai cercato di effettuare... :dunno:

risposto 10 anni fa
Gianni Tomasicchio
X 0 X

Ovvaimente i dati che inserisoc non sono quelli veri.Ho inserito all'inizio i seguentio dati per evdere se funzionava

tabella film:

insert into film(Titolo,Genere,Anno_prod,Regista,Attore) values('ciao','prova',2006-02-10,'io','dati')

tabella proiezione:

insert into proiezione(Codpr,Film,Codsala,IDcinema,Datapr,Ora_inizio) values (101,'ciao',100,'NA',2006-02-15,'18:30:00');

Appena scrivo questa insert(quella che riguarda proiezione) mi da errore.

risposto 10 anni fa
flaky
X 0 X

Ma le tabelle "cinema" e "sala" esistono? Contengono i dati referenziati dalla seconda INSERT?

risposto 10 anni fa
Gianni Tomasicchio
X 0 X

mi ero dimenticato di inserire i dtai in sala.

Adesso funziona

risposto 10 anni fa
flaky
X 0 X
Effettua l'accesso o registrati per rispondere a questa domanda