Pagina 1 di 3 1 2 3 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 21

Discussione: Problema foreign key

  1. #1

    Problema foreign key

    Ciao, il mio problema è questo:

    1)
    Lavoro con mysql workbench 5.2
    Ho 3 tabelle, di cui lo pseudocodice è:
    LAGHI: PK: id_lago
    FIUMI: PK: id_fiume
    LAGO-rel-FIUME: PK: id_lago, id_fiume
    FK: id_lago references LAGHI
    FK: id_fiume references FIUMI

    Ora se inserisco qualcosa nella tabella LAGO-rel-FIUME, le PK devono esistere nelle rispettive tabelle, altrimenti dovrebbe fermarsi o darmi un errore immagino; ma non avviene e fila tutto liscio. Inoltre su tabelle con più PK (3/4), dove sono ovviamente NOT NULL, posso anche inserirne solo una mandare l'ok, e funziona tutto.

    perchè succede tutto questo?

    2) in una tabella che mette in relazione più tabelle, una delle PK della tabella relazione può essere una FK presente in un'altra tabella (di quelle che mette in relazione)?

    graziee

  2. #2
    Utente di HTML.it L'avatar di Joe Taras
    Registrato dal
    Nov 2003
    residenza
    Taranto
    Messaggi
    955

    Re: Problema foreign key

    Originariamente inviato da Jimmy5nomana
    Ciao, il mio problema è questo:

    1)
    Lavoro con mysql workbench 5.2
    Ho 3 tabelle, di cui lo pseudocodice è:
    LAGHI: PK: id_lago
    FIUMI: PK: id_fiume
    LAGO-rel-FIUME: PK: id_lago, id_fiume
    FK: id_lago references LAGHI
    FK: id_fiume references FIUMI

    Ora se inserisco qualcosa nella tabella LAGO-rel-FIUME, le PK devono esistere nelle rispettive tabelle, altrimenti dovrebbe fermarsi o darmi un errore immagino; ma non avviene e fila tutto liscio. Inoltre su tabelle con più PK (3/4), dove sono ovviamente NOT NULL, posso anche inserirne solo una mandare l'ok, e funziona tutto.

    perchè succede tutto questo?

    2) in una tabella che mette in relazione più tabelle, una delle PK della tabella relazione può essere una FK presente in un'altra tabella (di quelle che mette in relazione)?

    graziee
    Se le FK sono a NULL il salvataggio avviene lo stesso, a meno che tu non abbia dichiarato quei campi a DB NOT NULL.
    Se l'FK è diversa da NULL allora deve essere presente il valore nella tabella padre.

    Da come hai descritto la relazione LAGO-FIUME la PK la farei come campo a parte e non come coppia LAGO-FIUME.

  3. #3

    codice

    Questo è il codice creato da MySQL:

    codice:
    CREATE TABLE IF NOT EXISTS `PROGETTO`.`FIUME:VICINO:LAGO` 
    
    ( `idFIUME` CHAR NOT NULL , 
      `idLAGO` CHAR NOT NULL , 
      `distanza_km` FLOAT NULL , 
      PRIMARY KEY (`idFIUME`, `idLAGO`) , 
      INDEX `idFIUME` (`idFIUME` ASC) , 
      INDEX `idLAGO` (`idLAGO` ASC) , 
      CONSTRAINT `idFIUME` FOREIGN KEY (`idFIUME` ) REFERENCES `PROGETTO`.`FIUME` (`nome` ) ON DELETE SET NULL ON UPDATE CASCADE, 
      CONSTRAINT `idLAGO` FOREIGN KEY (`idLAGO` ) REFERENCES `PROGETTO`.`LAGO` (`nome` ) ON DELETE SET NULL ON UPDATE CASCADE) 
    
    ENGINE = InnoDB
    Inserendo PK non presenti nelle rispettive tabelle di LAGO e FIUME fila tutto liscio, così come inserendo una sola PK (a caso) e lasciando l'altra PK a NULL.

  4. #4
    Utente di HTML.it L'avatar di Joe Taras
    Registrato dal
    Nov 2003
    residenza
    Taranto
    Messaggi
    955

    Re: codice

    Originariamente inviato da Jimmy5nomana
    Questo è il codice creato da MySQL:

    codice:
    CREATE TABLE IF NOT EXISTS `PROGETTO`.`FIUME:VICINO:LAGO` 
    
    ( `idFIUME` CHAR NOT NULL , 
      `idLAGO` CHAR NOT NULL , 
      `distanza_km` FLOAT NULL , 
      PRIMARY KEY (`idFIUME`, `idLAGO`) , 
      INDEX `idFIUME` (`idFIUME` ASC) , 
      INDEX `idLAGO` (`idLAGO` ASC) , 
      CONSTRAINT `idFIUME` FOREIGN KEY (`idFIUME` ) REFERENCES `PROGETTO`.`FIUME` (`nome` ) ON DELETE SET NULL ON UPDATE CASCADE, 
      CONSTRAINT `idLAGO` FOREIGN KEY (`idLAGO` ) REFERENCES `PROGETTO`.`LAGO` (`nome` ) ON DELETE SET NULL ON UPDATE CASCADE) 
    
    ENGINE = InnoDB
    Inserendo PK non presenti nelle rispettive tabelle di LAGO e FIUME fila tutto liscio, così come inserendo una sola PK (a caso) e lasciando l'altra PK a NULL.
    Strano, mi sembra tutto corretto (a parte il discutibile fatto che leghi al nome di un lago / fiume l'FK e non ad un ipotetico ID).
    (Curiosità) Ma il campo nome è PK per quelle tabelle?

  5. #5
    id_FIUME e id_LAGO sono PK, e FK di id_FIUME nella relativa tabella FIUME, e id_LAGO nella rispettiva tabella LAGO.
    Mi serve questa coppia di PK perchè non si ripeta la stessa vicinanza FIUME-LAGO più volte (usando i nomi di fiume e laghi in coppia funziona)

    boh non ne ho la più pallida idea.................... se volessi fare il CHECK in fase di creazione tabella su MySQL, ho letto che non è presente e viene implementato tramite TRIGGER: ne sai qualcosa? cioè come dovrebbe essere? Io ho provato ma non funge

    codice:
    -- Trigger DDL Statements 
    DELIMITER $$ 
    USE `PROGETTO`$$ 
    create trigger controlla_orario BEFORE INSERT on ALBERGO 
    FOR EACH ROW 
    CHECK NEW.orario_a<NEW.orario_f 
    $$

  6. #6

  7. #7
    Ciao scusa non ha capito perche' ti serve un check o un trigger... cosa vuoi fare?

  8. #8
    Quando inserisco in ALBERGO gli orari di inzio e fine, la fine deve essere maggiore dell'inizio. Il record sarà inserito solo se verrà soddisfatta la relazione orario_fine > orario_inizio.

    P.s. ma in MySQL ho letto che non si può aggiungere il check e si devono usare i trigger (in effetti non vedo il posto per inserire un check)

  9. #9
    Potresti postare il codice della tabella ALBERGO (create table) cosi gli do un occhiata grazie

  10. #10
    Eccolo

    Codice PHP:
    CREATE  TABLE IF NOT EXISTS `PROGETTO`.`ALBERGO` (
      `
    idALBERGOINT NOT NULL AUTO_INCREMENT COMMENT 'identificativo dell\' albergo' ,
      `
    nomeVARCHAR(45NULL COMMENT 'Il nome dell\'albergo' ,
      `
    vialeVARCHAR(45NULL COMMENT 'Il viale in cui si trova    ' ,
      `
    numeroINT(11NULL COMMENT 'Il numero civico che gli appartiene' ,
      `
    aperturaDATE NULL COMMENT 'Data di inzio apertura (inizio stagione)' ,
      `
    chiusuraDATE NULL COMMENT 'Data di chiusura (fine stagione)' ,
      `
    orario_aTIME NULL COMMENT 'Orario di apertura' ,
      `
    orario_fTIME NULL COMMENT 'Orario di chiusura' ,
      `
    disponibilitaINT(11NULL COMMENT 'Disponiblità posti liberi ' ,
      `
    costo_interoINT(11NULL COMMENT 'Costo del prezzo intero' ,
      `
    costo_ridottoINT(11NULL COMMENT 'Costo del prezzo ridotto' ,
      `
    stelleINT(11NULL COMMENT 'Classificazione in base al criterio delle stelle' ,
      `
    telefonoINT(11NULL COMMENT 'Recapito telefonico' ,
      `
    mailVARCHAR(45NULL COMMENT 'Recapito e-mail' ,
      `
    webVARCHAR(45NULL COMMENT 'Sito Web relativo all\'ente' ,
      `
    idPAESEINT NOT NULL COMMENT 'identificatore lago' ,
      
    PRIMARY KEY (`idALBERGO`) ,
      
    INDEX `idPAESE` (`idPAESEASC) ,
      
    CONSTRAINT `idPAESE`
        
    FOREIGN KEY (`idPAESE` )
        
    REFERENCES `PROGETTO`.`PAESE` (`idPAESE` )
        
    ON DELETE SET NULL
        ON UPDATE CASCADE
    )
    ENGINE InnoDB 

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