Visualizzazione dei risultati da 1 a 5 su 5
  1. #1

    Errore in Update (non vecchio post) "strano"

    Dico strano xkè non riesco a capire dove sta il problema, quindi vengo subito al punto.

    La tabella:
    id int(11)
    data varchar(10)
    ora varchar(5)
    motivo varchar(30)
    inserimento timestamp(14)
    visto char(1)

    La chiave è inserimento, generato automaticamente quando vbiene inserito un record.

    L'update consiste nell'aggiornare il campo visto da 0 a 1.

    Se c'è da aggiornare solo una riga tutto fila liscio, se sono 2 o + ottengo l'aggiornamento di una riga e poi l'errore: impossibile aggiornare valore duplicato della chiave.

    La chiave è unica l'update è:

    update nobadge set visto='1' where inserimento<$limite and visto ='0';

    $limite viene generato nel momento in cui si visualizza la pagina con l'elenco della tabella.
    File Reality.sys corrupted. Reboot universe (Y/N)? Y_

  2. #2

    Re: Errore in Update (non vecchio post) "strano"

    [supersaibal]Originariamente inviato da LonelyWolf
    Dico strano xkè non riesco a capire dove sta il problema, quindi vengo subito al punto.

    La tabella:
    id int(11)
    data varchar(10)
    ora varchar(5)
    motivo varchar(30)
    inserimento timestamp(14)
    visto char(1)

    La chiave è inserimento, generato automaticamente quando vbiene inserito un record.

    L'update consiste nell'aggiornare il campo visto da 0 a 1.

    Se c'è da aggiornare solo una riga tutto fila liscio, se sono 2 o + ottengo l'aggiornamento di una riga e poi l'errore: impossibile aggiornare valore duplicato della chiave.

    La chiave è unica l'update è:

    update nobadge set visto='1' where inserimento<$limite and visto ='0';

    $limite viene generato nel momento in cui si visualizza la pagina con l'elenco della tabella. [/supersaibal]
    Il valore temporale viene letto una sola volta per ogni query e applicato a tutte le righe che si inseriscono. Quindi se hai una chiave unica o primaria su timestamp non puoi utilizzare un inserimento/update multiplo e a volte neanche singolo ripetuto immediatamente perche' potrebbe beccare lo stesso secondo.

    Soluzione? non si deve usare una chiave primaria o unica per quel campo, perche' non puo' rispondere sempre al requisito di unicita'. Ecco perche' esiste un id numerico autoincrement....


    Il silenzio è spesso la cosa migliore. Pensa ... è gratis.

  3. #3
    Ti posso assicurare che nel mio caso d'utilizzo è unica, il timestamp viene generato ad ogni query di inserimento e in tutta la tabella non ce ne sono 2 uguali.
    $limite invece viene generato quando si visualizzano i dati della tabella ed è necessario xkè se qualk1 inserisce un nuovo record mentre io guardo l'elenco non lo vedo e sarebbe segnato come visto ugualmente.

    Comunque, anche inserendo 2 record a distanza di secondi o minuti (l'ho fatto per prova) il risultato non cambia, sempre quell'errore.

    Se invece ho capito male, è sufficiente che io cambi la chiave primaria?
    File Reality.sys corrupted. Reboot universe (Y/N)? Y_

  4. #4
    Sicuramente una chiave basata su un timestamp non va bene. Il timestamp viene aggiornato automaticamente ad ogni update, parlando di un timestamp(14) di mysql.

    L'update where campo < di qualcosa non esclude aggiornamenti multipli... cioe' possono esserci svariate tuple con quella caratteristica e verrebbero tutte aggiornate allo stesso timestamp.

    Se il campo "inserimento" non deve cambiare sarebbe meglio usare un campo DATETIME.


    Il silenzio è spesso la cosa migliore. Pensa ... è gratis.

  5. #5
    Ora mi è chiaro tutto, quindi aggiorna il timestamp anke se non gli dico di farlo ecco dove sta l'inghippo!

    Per il mio scopo posso cambiarlo in varchar.

    Grazie.
    File Reality.sys corrupted. Reboot universe (Y/N)? Y_

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.