PDA

View Full Version : Valore chiave primaria database


Steel Jans
29-09-2007, 14:29
Ho creato un piccolo db access con il relativo programmino in vb.net. Nel normale utilizzo di un db vengono aggiunti e rimossi record. Ora il punto è questo: c'è un modo per far sì che nel momento in cui viene aggiunto un record il valore della sua chiave primaria possa assumere un valore appartenuto precedentemente ad un altro record? Nel mio caso la chiave primaria è un contatore.
Grazie

fabianoda
29-09-2007, 17:44
Se il tuo campo è un contatore, allora non puoi farci nulla. Io avevo un problema simile, l'ho risolto usando un intero al posto del contatore e gestendo autonomamente l'assegnazione della chiave primaria.

Steel Jans
30-09-2007, 09:36
Alla fine non è un problema, ma mi chiedevo nel caso in cui venisse saturato tutto il range dei valori del contatore (che se non erro è un intero a 32 bit) come si comporterebbe il db.
Grazie comunque.

fabianoda
30-09-2007, 20:54
Non so, dal punto di vista teorico il DB dovrebbe dare errore. Non so quale sia il comportamento effettivo dei DBMS reali, però..

cionci
01-10-2007, 10:21
Il modo c'è...basta assegnare manualmente il contatore e inserire un numero libero nella query.

fabianoda
01-10-2007, 14:08
Il modo c'è...basta assegnare manualmente il contatore e inserire un numero libero nella query.

Dipende dal database imho. Io ricordo di alcuni database (come minimo Ingres) che non mi lasciavano inserire il valore della chiave primaria se era un contatore. E questo è concettualmente corretto, perché mettendo un contatore la tua intenzione è: "non voglio gestire la chiave primaria, mi basta inserire dati". Non escludo, come dici te, che alcuni DBMS permettano questo "trucco", però non è concettualmente corretto.

cionci
01-10-2007, 14:12
Perché non è concettualmente corretto ? L'unico vincolo di una chiave primaria è che sia univoca.

fabianoda
01-10-2007, 14:14
Non è corretto in relazione al concetto di "contatore". Sono d'accordo sulla chiave primaria, ma non sul tipo di dato - cioè, se scegli un counter significa che non vuoi gestire la questione.
Questa è comunque una sottigliezza, in realtà cambia poco nel 99% dei casi :)

cionci
01-10-2007, 14:40
Sì, su questo siamo d'accordo.

Steel Jans
01-10-2007, 15:07
Quindi alla fine vale la pena di impostare un campo id su tipo di dato numerico piuttosto che come contatore. Anche se il mio prog non da problemi non mi piace il fatto che eliminando e aggiungendo record rimangano dei valori per la chiave non utilizzati.

cionci
01-10-2007, 15:18
Puoi sempre fare una compattazione in un secondo momento.

Steel Jans
01-10-2007, 17:21
magari sviluppando un apposita utility che si occupa degli shift tra i record in modo da riempire spazi vuoti. E' una soluzione!