Autore Topic: Autoincremento  (Letto 1794 volte)

Offline dregi

  • Gambero
  • **
  • Post: 85
  • Non possum tuis usque tandem abutere patientiae?
    • Mostra profilo
Autoincremento
« il: 12 Settembre 2019, 11:09:01 »
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....
Codice: [Seleziona]
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?
« Ultima modifica: 12 Settembre 2019, 11:12:24 da dregi »

Offline Gianluigi

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 4.244
  • Tonno verde
    • Mostra profilo
Re:Autoincremento
« Risposta #1 il: 12 Settembre 2019, 15:25:52 »
Intanto avresti dovuto dire come hai creato la tabella, l'hai creata con Gambas?
nuoto in attesa del bacio di una principessa che mi trasformi in un gambero azzurro

Offline dregi

  • Gambero
  • **
  • Post: 85
  • Non possum tuis usque tandem abutere patientiae?
    • Mostra profilo
Re:Autoincremento
« Risposta #2 il: 12 Settembre 2019, 19:14:06 »
No, ho usato DBeaver, pgAdmin non mi funziona. DBeaver  altro non fa se non preparare l'esecuzione di una SQL

Offline Gianluigi

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 4.244
  • Tonno verde
    • Mostra profilo
Re:Autoincremento
« Risposta #3 il: 12 Settembre 2019, 19:23:23 »
Penso che avresti dovuto creare la tabella auto incrementale prima di popolarla e non dopo.
nuoto in attesa del bacio di una principessa che mi trasformi in un gambero azzurro

Offline dregi

  • Gambero
  • **
  • Post: 85
  • Non possum tuis usque tandem abutere patientiae?
    • Mostra profilo
Re:Autoincremento
« Risposta #4 il: 13 Settembre 2019, 23:47:20 »
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:
Codice: [Seleziona]
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
« Ultima modifica: 13 Settembre 2019, 23:52:57 da dregi »

Offline dex

  • Gran Maestro dei Gamberi
  • *****
  • Post: 872
    • Mostra profilo
Re:Autoincremento
« Risposta #5 il: 14 Settembre 2019, 00:23:32 »
ciao
scusa ma non avresti fatto prima a creare una nuova tabella auto incrementale con DBeaver auto incrementale e poi riversare con gambas i dati della vecchia tabella?

Offline dregi

  • Gambero
  • **
  • Post: 85
  • Non possum tuis usque tandem abutere patientiae?
    • Mostra profilo
Re:Autoincremento
« Risposta #6 il: 14 Settembre 2019, 18:26:09 »
L'ho scritto, c'ho provato. Ma nisba! Non funge, dà errore.

Offline Berserker79

  • Grande Gambero
  • ***
  • Post: 201
    • Mostra profilo
Re:Autoincremento
« Risposta #7 il: 14 Settembre 2019, 19:38:14 »
Ciao dredi, cosa da errore più nello specifico?
Potresti postare il codice che hai utilizzato per creare la tabella autoincrementale e il codice che usi per la popolazione della tabella.
Ciao.

Offline dex

  • Gran Maestro dei Gamberi
  • *****
  • Post: 872
    • Mostra profilo
Re:Autoincremento
« Risposta #8 il: 14 Settembre 2019, 20:09:11 »
L'ho scritto, c'ho provato. Ma nisba! Non funge, dà errore.

ma hai provato a popolare la nuova tabella postgres da:
access > postgres oppure postgres > postgres?

non conosco postgres ma presumo che lavori tipo mysql
su mysql abbiamo riversato centinaia di tabelle in nuove tabelle diverse
è successo spesso che, per mutate esigenze in una tabella dovevamo cambiare sia il campo che il formato, con semplici query riversavamo tutto nella nuova e poi si eliminavano le vecchie

Offline dregi

  • Gambero
  • **
  • Post: 85
  • Non possum tuis usque tandem abutere patientiae?
    • Mostra profilo
Re:Autoincremento
« Risposta #9 il: 21 Settembre 2019, 11:04:35 »
Premessa: nel "travaso" dei dati da Access a Postgres con un file csv, ho necessità di mantenere l'associazione del numero di ID, che in Access è autoincrementante, con il cognome e nome. Nella nuova tabella in Postgres se pongo ID autoincrementante prima di effettuare il passaggio dati, corro il rischio che la mia premessa non venga rispettata e di trovarmi un dato cognome e nome con ID diverso rispetto a quello che era presente in Access.
Per il passaggio utilizzo DBeaver come lettore di csv,  Spero di essere riuscito a spiegarmi.

Per Berserker79, l'errore avviene dopo in Gambas quando tento di inserire un nuovo record. Li mi dice che la chiave esiste già

Offline Gianluigi

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 4.244
  • Tonno verde
    • Mostra profilo
Re:Autoincremento
« Risposta #10 il: 21 Settembre 2019, 15:00:47 »
Premessa: nel "travaso" dei dati da Access a Postgres con un file csv, ho necessità di mantenere l'associazione del numero di ID, che in Access è autoincrementante, con il cognome e nome. Nella nuova tabella in Postgres se pongo ID autoincrementante prima di effettuare il passaggio dati, corro il rischio che la mia premessa non venga rispettata e di trovarmi un dato cognome e nome con ID diverso rispetto a quello che era presente in Access.
Quale rischio corri lo devi verificare, se non hai eliminato dei record...
Citazione
Per il passaggio utilizzo DBeaver come lettore di csv,  Spero di essere riuscito a spiegarmi.
DBeaver non lo conosco
Citazione
Per Berserker79, l'errore avviene dopo in Gambas quando tento di inserire un nuovo record. Li mi dice che la chiave esiste già
Evidentemente Gambas riparte da 1, so che c'è il sistema in Postgres per partire con l'auto incrementale da un dato numero, oppure invece niente auto incrementale e l'id lo imposti tu.
nuoto in attesa del bacio di una principessa che mi trasformi in un gambero azzurro

Offline dregi

  • Gambero
  • **
  • Post: 85
  • Non possum tuis usque tandem abutere patientiae?
    • Mostra profilo
Re:Autoincremento
« Risposta #11 il: 21 Settembre 2019, 17:24:43 »
Gianluigi > .....se non hai eliminato dei record...

Appunto! sai quanti! Quindi diventerebbe un casino. Meglio come dicevi e come ho fatto.