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

    foreign key e valori nulli, farli convivere

    ciao,
    ho un problema che non so come risolvere.
    La situazione questa:
    -ho una tabella A che ha dei campi con FK verso altre tabelle, ma gli stessi campi possono anche essere nulli per motivi che non sto qui a discutere.

    Adesso se vado ad inserire una nuova riga e lascio i campi FK vuoti, ottengo un errore
    The insert failed because a column definition includes validation constraints.
    validation error for column PROGETTO, value "*** null ***".
    Come faccio a risolvere??

    Il DBMS e Firebird 1.5, e la colonna progetto non e' marcata come not null.

    bye bye

  2. #2
    Utente di HTML.it L'avatar di kuarl
    Registrato dal
    Oct 2001
    Messaggi
    1,093

    Re: foreign key e valori nulli, farli convivere

    [supersaibal]Originariamente inviato da FreeManX
    ciao,
    ho un problema che non so come risolvere.
    La situazione questa:
    -ho una tabella A che ha dei campi con FK verso altre tabelle, ma gli stessi campi possono anche essere nulli per motivi che non sto qui a discutere.

    Adesso se vado ad inserire una nuova riga e lascio i campi FK vuoti, ottengo un errore


    Come faccio a risolvere??

    Il DBMS e Firebird 1.5, e la colonna progetto non e' marcata come not null.

    bye bye [/supersaibal]
    il fatto è che per definizione i vincoli di integrità devono essere collegati a tutti i record della tabella, se tu inserisci un valore nullo, significa che quel valore va contro la definizione di vincolo.

    Con una buona progettazione del db situazioni di questo tipo non devono accadere, quindi le soluzioni sono due, la prima è caldamente consigliata è:
    rivedi la struttura del database e costruiscilo in modo che tale soluzione non si presenti
    la seconda, artigianale che va bene per un rattoppo è:
    invece di darle un valore nullo gli dai un valore di default che colleghi ad un record di default nell'altra tabella, in questo modo il vincolo non è violato ma è una cosa assai casereccia...

  3. #3

    Re: Re: foreign key e valori nulli, farli convivere

    [supersaibal]Originariamente inviato da kuarl
    il fatto è che per definizione i vincoli di integrità devono essere collegati a tutti i record della tabella, se tu inserisci un valore nullo, significa che quel valore va contro la definizione di vincolo.

    Con una buona progettazione del db situazioni di questo tipo non devono accadere, quindi le soluzioni sono due, la prima è caldamente consigliata è:
    rivedi la struttura del database e costruiscilo in modo che tale soluzione non si presenti
    la seconda, artigianale che va bene per un rattoppo è:
    invece di darle un valore nullo gli dai un valore di default che colleghi ad un record di default nell'altra tabella, in questo modo il vincolo non è violato ma è una cosa assai casereccia... [/supersaibal]
    rigurdo la struttura del db, non posso fare rattoppi altrimenti la lode me la sogno

    grazie

  4. #4
    Uhmm riguardando il progettoe' un casino,
    per evitare gli FK nulli devo implementare 18 relazioni invece di 9

  5. #5
    Utente di HTML.it L'avatar di kuarl
    Registrato dal
    Oct 2001
    Messaggi
    1,093
    [supersaibal]Originariamente inviato da FreeManX
    Uhmm riguardando il progettoe' un casino,
    per evitare gli FK nulli devo implementare 18 relazioni invece di 9 [/supersaibal]
    cerca di trovare un'altro modo... se è per l'uni di sicuro mettere un vincolo del genere è un errore

  6. #6
    [supersaibal]Originariamente inviato da kuarl
    cerca di trovare un'altro modo... se è per l'uni di sicuro mettere un vincolo del genere è un errore [/supersaibal]
    ho trovato ho tolto il vincolo, ma per verificare l'integrita quando il valore non e' nullo utilizzo una procedura interna per andare a controllare se esiste tale valore nella tabella della FK...
    Non e' il massimo... ma sempre meglio di 19 relazioni

  7. #7
    Ciao,
    probabilmente c'è qualcosa che non va a monte, nella progettazione del database, ma se in ogni caso, dopo aver rivisto la progettazione, ti servono 19 relazioni... ti servono 19 relazioni.
    per favore NIENTE PVT TECNICI da sconosciuti

  8. #8
    [supersaibal]Originariamente inviato da Fabio Heller
    Ciao,
    probabilmente c'è qualcosa che non va a monte, nella progettazione del database, ma se in ogni caso, dopo aver rivisto la progettazione, ti servono 19 relazioni... ti servono 19 relazioni. [/supersaibal]
    il progetto rappresenta un archivio di tesi, ora le tesi di primo livello (3 anni) possono o non possono avere un tirocinio associato, e questo riferimento nell'entità TESI all'entità TIROCINI che crea uno dei casi (poi ne ne sono altri due campi con la stessa situazione)
    Ma in nessun modo li posso evitare, se non cambiando il significato ed obbligare ogni tesi ad avere un tirocinio associato.

  9. #9
    [supersaibal]Originariamente inviato da FreeManX
    il progetto rappresenta un archivio di tesi, ora le tesi di primo livello (3 anni) possono o non possono avere un tirocinio associato, e questo riferimento nell'entità TESI all'entità TIROCINI che crea uno dei casi (poi ne ne sono altri due campi con la stessa situazione)
    Ma in nessun modo li posso evitare, se non cambiando il significato ed obbligare ogni tesi ad avere un tirocinio associato.
    [/supersaibal]
    I tirocinii hanno dati propri (es, nome del tipo di tirocinio etc.etc.)?

    Una struttura di questo tipo non va bene?

    tesi
    ----------
    id_tesi
    autore
    altro...


    tirocini
    ----------
    id_tirocinio
    id_tesi
    altro...


    Le tesi che non hanno tirocinio sono assenti dalla seconda tabella e le ricavi da un left join tra la tabella tesi e quella tirocini WHERE id_tirocinio is null

    Io ho usato degli id come chiavi primarie, ma se ci sono delle chiavi naturali meglio
    per favore NIENTE PVT TECNICI da sconosciuti

  10. #10
    [supersaibal]Originariamente inviato da Fabio Heller
    I tirocinii hanno dati propri (es, nome del tipo di tirocinio etc.etc.)?

    Una struttura di questo tipo non va bene?

    tesi
    ----------
    id_tesi
    autore
    altro...


    tirocini
    ----------
    id_tirocinio
    id_tesi
    altro...


    Le tesi che non hanno tirocinio sono assenti dalla seconda tabella e le ricavi da un left join tra la tabella tesi e quella tirocini WHERE id_tirocinio is null

    Io ho usato degli id come chiavi primarie, ma se ci sono delle chiavi naturali meglio [/supersaibal]
    ma id_tesi in tirocini cmq non puo essere ua FK, altrimenti il problema resta xke come detto sopra non tutti i tirocini hanno una tesi assegnata (ed non tutte le tesi anno un tirocinio assegnato)

    Io come detto sopra o risolto (anche se non mi piace tanto come soluzione) eliminando la FK ed creando una procedura:

    codice:
    begin
      /* Procedure Text */
      if (idtesi is null) then
        begin
            idts= null;
        end
        else
            begin
              if (not exists(select  t.idtesi from tesi t
                                where t.idtesi = :idtesi and t.tipo='P' and t.stato='C')) then
                                    exception FK_ERROR;
        
                          select  t.tipo, t.stato from tesi t
                                where t.idtesi = :idtesi into :t, :s;
                
                if (t='P' and s='C') then
                    idts = idtesi;
                 else
                    exception NO_CONTINUA;
            end
    
      suspend;
    end
    da utilizzare quando si fa un insert cosi da controllare il FK a mano

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.