Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 18
  1. #1

    [MYSQL] Problema di query e chiavi esterne

    Salve a tutti. Ho un problema di questo tipo:

    Su un database chiamato 'piscina' ho, tra le altre, 3 tabelle di cui una è una (m,n) delle altre due.
    Devo fare una query su file php che mi aggiunga un'utente tramite form html.

    Le tabelle son cosi inizializzate:

    create table utente(
    id_utente int primary key auto_increment,
    nome varchar(20) not null,
    cognome varchar(30) not null,
    indirizzo varchar(40) not null,
    tel varchar(10)
    );

    create table attivita(
    id_attivita int primary key auto_increment,
    descrizione varchar(30) not null,
    giornate varchar(40) not null,
    orario varchar(40) not null,
    nmax_iscritti tinyint,
    data_inizio date,
    data_fine date,
    costo decimal (5,2),
    id_abb int,
    foreign key (id_abb) references abbonamento (id_abb) on update cascade on delete cascade
    );

    create table lezioni(
    id_utente int,
    id_attivita int,
    primary key (id_utente, id_attivita),
    foreign key (id_utente) references utente (id_utente) on update cascade on delete cascade,
    foreign key (id_attivita) references attivita (id_attivita) on update cascade on delete cascade
    );


    La riga php è questa:

    $inserimento=mysql_query("INSERT INTO lezioni(id_utente,id_attivita) VALUES ('select id_utente from utente where nome=$nomeut and cognome=$cognomeut and indirizzo=$indirizzout ', 'select id_attivita from attivita where (attivita.descrizione)=($corso)')") or die ("ERRORE!!?!".mysql_error());

    e l'errore che mi da è questo:

    ERRORE!!?!Cannot add or update a child row: a foreign key constraint fails (`piscina`.`lezioni`, CONSTRAINT `lezioni_ibfk_1` FOREIGN KEY (`id_utente`) REFERENCES `utente` (`id_utente`) ON DELETE CASCADE ON UPDATE CASCADE)

    ora, considerando che le query prese singolarmente su terminale funzionano perchè le ho verificate, che potete consigliarmi?

    grazie in anticipo!




  2. #2
    Utente di HTML.it
    Registrato dal
    Dec 2002
    Messaggi
    1,326
    premetto che non conosco bene Mysql, ma perchè fai:

    on update cascade ???

    foreign key (id_utente) references utente (id_utente) on update cascade on delete cascade,

    io penso che il tuo errore sia dovuta ad una cattiva manipolazione delle FK


    ma forse mi sbaglio!

  3. #3
    Quote Originariamente inviata da 123delphi321 Visualizza il messaggio
    premetto che non conosco bene Mysql, ma perchè fai:

    on update cascade ???

    foreign key (id_utente) references utente (id_utente) on update cascade on delete cascade,

    io penso che il tuo errore sia dovuta ad una cattiva manipolazione delle FK


    ma forse mi sbaglio!

    faccio cosi perchè, essendo una tabella (m,n), facendo on update cascade (teoricamente), aggiornando i dati della tabella di riferimento si devono aggiornare automaticamente pure li! stesso discorso col delete, cancellando una riga da una tabella si rimuove pure da li!

    Sempre se ho capito bene io, sia ben chiaro

    Ho pensato pure io che ci fosse un'errore sulla gestione delle FK, ma dopo varie modifiche, sono arrivato ad un vicolo morto!

  4. #4
    Utente di HTML.it
    Registrato dal
    Dec 2002
    Messaggi
    1,326
    scusa ma cosa significa 'tabella (m,n)' ?

    'on cascade delete' serve nel caso in cui elimini il record id dalla tabella principale vengono eliminati in cascata tuti i record che fanno riferimento a quell'id.

    con update on cascade cosa dovrbbe fare?

  5. #5
    Quote Originariamente inviata da 123delphi321 Visualizza il messaggio
    scusa ma cosa significa 'tabella (m,n)' ?

    'on cascade delete' serve nel caso in cui elimini il record id dalla tabella principale vengono eliminati in cascata tuti i record che fanno riferimento a quell'id.

    con update on cascade cosa dovrbbe fare?
    scusami ti rispondo citando la definizione da dove ho tratto spunto perchè a volte quando mi spiego, sembro uno zulù!
    "ON UPDATE CASCADESpecifica che se si tenta di aggiornare un valore di chiave in una riga e a tale valore fanno riferimento chiavi esterne in righe esistenti in altre tabelle, tutti i valori che compongono la chiave esterna verranno anch'essi aggiornati al nuovo valore specificato per la chiave "


    in pratica, nella tabella "lezioni", ho ad esempio 'id_utente' , che è chiave esterna e fa riferimento alla chiave primaria della tabella 'utente'.
    Sempre se ho ben capito, modificando 'id_utente' dalla tabella 'utente', si dovrebbe modificare automaticamente anche nella tabella 'lezioni', grazie ad 'on update cascade'!

  6. #6
    ciao,

    ado occhio la struttura delle tabelle mi sembra corretto... La query mi sembra scritta un po male..cosa vuoi fare con la query?
    Non si può risolvere un problema usando lo stesso modo di pensare che ha creato quel problema.
    Albert Einstein

    Siate Affamati, siate Folli, siate Onesti e siate Generosi

  7. #7
    Utente di HTML.it
    Registrato dal
    Dec 2002
    Messaggi
    1,326
    scusa ma cosa significa 'tabella (m,n)' ?


    per update è cosi come lo descrivi!

    ma tu madifichi l'id della tabella utente? potresti spiegarmi a cosa ti serve?

  8. #8
    Quote Originariamente inviata da bomberdini Visualizza il messaggio
    ciao,

    ado occhio la struttura delle tabelle mi sembra corretto... La query mi sembra scritta un po male..cosa vuoi fare con la query?
    ciao!
    In pratica con questa query dovrei prendere 3 dati mediante get da un form che mi gestisce l'iscrizione di un nuovo utente ad un corso.

    In una query precedente registro il nuovo utente nella tabella utente, e ok.
    Poi con questa seconda query dovrei salvare nella tabella 'lezioni' l'id_utente' del nuovo arrivato e abbinarlo ad id_attività, che non è altro che la chiave primaria della tabella contenente tutte le attività disponibili!

    ho fatto degli echo sui dati che passo con get, e me li stampa giusti, quindi il problema non sembra giungere da li..

  9. #9
    prova una cosa del genere:
    codice:
    $inserimento=mysql_query("INSERT INTO lezioni(id_utente,id_attivita) VALUES ((select id_utente from utente where nome=$nomeut and cognome=$cognomeut and indirizzo=$indirizzout ), (select id_attivita from attivita where (attivita.descrizione)=($corso)))") or die ("ERRORE!!?!".mysql_error());
    Non si può risolvere un problema usando lo stesso modo di pensare che ha creato quel problema.
    Albert Einstein

    Siate Affamati, siate Folli, siate Onesti e siate Generosi

  10. #10
    Utente di HTML.it
    Registrato dal
    Dec 2002
    Messaggi
    1,326
    scusami ancora ....

    a me mi hanno sempre suggerito, e mi trovato benissimo sia per performance che per logica di manipolazione, la creazione per ogni singola tabella di un id come chiave primaria.

    nella tua tabella in questione:

    codice:
    create table lezioni(
    id_utente int,
    id_attivita int,
    primary key (id_utente, id_attivita),
    foreign key (id_utente) references utente (id_utente) on update cascade on delete cascade,
    foreign key (id_attivita) references attivita (id_attivita) on update cascade on delete cascade
    );
    non esiste la chiave id.

    sia ben chiaro, non è un errore, ma forse non è bene non averlo


    nel comando:

    codice:
    "INSERT INTO lezioni(id_utente,id_attivita) VALUES ('select id_utente from utente where nome=$nomeut and cognome=$cognomeut and indirizzo=$indirizzout ', 'select id_attivita from attivita where (attivita.descrizione)=($corso)')")

    select id_utente from utente where nome=$nomeut and cognome=$cognomeut and indirizzo=$indirizzout

    restituisce sempre un unico record?

    e questa:
    select id_attivita from attivita where (attivita.descrizione)=($corso)

    restituisce sempre un unico record?

    dalla strutura delle tabelle che hai postato direi di NO.
    Ultima modifica di 123delphi321; 12-06-2014 a 10:57

Tag per questa discussione

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 © 2025 vBulletin Solutions, Inc. All rights reserved.