Allora, partiamo dall'inizio, migro una tabella di database da access a postgres senza aver creato nella tabella in postgres alcuna chiave primaria. va tutto liscio, la nuova tabella viene popolata dai dati, a parte un particolare che affronterò in altro topic. Successivamente nella nuova tabella postgres rendo chiave primaria autoincrementate la colonna "id". Se vado a fare qualche modifica ai dati del database, funziona tutto ok, ma se tento l'inserimento col codice che segue più sotto, di un nuovo record, ottengo l'errore: Cannot create record: ERROR: duplicate key value violates unique constraint "clienti_pkey1" DETAIL: Key (id)=(2) already exists. Ossia, mi sembra di capire che la colonna id "non ha in memoria" quanti record sono già presenti....
Public Sub Salva()
$Con.Begin
res = $Con.Create("clienti")
If res.Available Then
res!cognome = txtCognome.Text
res!nome = txtNome.Text
res!indirizzo = txtIndirizzo.Text
res!luogo = txtCitta.Text
res!telefono = txtTelefono.Text
res!cellulare = txtCellulare.Text
res!cf = txtCodFisc.Text
res!email = txtEmail.Text
res.Update
Endif
$Con.Commit
Catch
$Con.Rollback
Message.Error(Error.Text)
End
L'errore è stato quello di non rendere da subito autoincrementante id, prima di popolare la tabella con i dati? In Access lo potevo fare, in postgres è questo il problema? in allegato un'immagine della tabella. Ho sbagliato qualcos'altro?
Dopo aver perso la testa mezza giornata a tentare di far lavorare quel campo in auto-incremento, dopo un bel delete di tutto e una ripopolazione da file csv con id preparato auto-incrementante, ma senza ottenere alcunchè, ho deciso di adottare questa soluzione:
Dim IdMax As Variant
res = $Con.Exec("SELECT id FROM clienti order by id desc limit 1")
idMax = res!id
idMax = idMax + 1 'incrementa di 1 il valore massimo letto colonna id
'---------------------------------------------------------------------------------
$Con.Begin
res = $Con.Create("clienti")
If res.Available Then
res!id = idMax 'per l'incremento
res!cognome = txtCognome.Text
res!nome = txtNome.Text
Forse non è molto ortodossa,ma mi ha risolto i problemi. Pensi sia scandalosa? ;D