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

    [mysql] inserire il valore "-1" in una colonna auto increment

    Salve a tutti,
    ho una tabella con un campo chiave "id" auto increment.
    Effettuo una INSERT imponendo id = -1.
    La riga viene memorizzata correttamente
    Effettuo poi una INSERT senza imporre il valore dell'id e verifico che MySQL ha correttamente "creato" un id per questa nuova riga.
    Da questo esperimento credevo di aver capito che MySQL permette l'inserimento di valori negativi per il campo auto increment senza pregiudicare il corretto funzionamento del campo stesso...

    un utente di un mio software (che fa uso di questo giochino dell'id negativo) ha un problema con l'inserimento dei dati. Mi dice che è riuscito ad inserirne uno solo. Ecco il dump della sua tabella:

    INSERT INTO `nometabella` VALUES (-1, -1, '', '', '0000-00-00 00:00:00', 'testo');
    INSERT INTO `nometabella` VALUES (2147483647, 2, '24.20.32.151', 'nomeutente', '2005-04-18 17:51:32', '');

    come è evidente la riga con l'id negativo è stata inserita correttamente. Questa però ha sballato il conto del campo autoincrement portandolo a 2147483647 che suppongo essere il massimo numero raggiungibile da un campo insert.

    La sua versione del server è la 4.0.16 mentre io ho fatto i test con la 4.0.22.

    Possibile che queste due versioni abbiamo un diverso comportamento a riguardo? Qualche idea? :master:

  2. #2
    non è che il cmapo è definito come unsigned? :P

    cmq forzare un valore [per di più negativo] di un cmapo auto_increment è concettualmente sbagliato...

  3. #3
    Originariamente inviato da }gu|do[z]{®©
    non è che il cmapo è definito come unsigned? :P
    no, infatti nel dump è presente il valore "-1"
    cmq forzare un valore [per di più negativo] di un cmapo auto_increment è concettualmente sbagliato...
    sono daccordo ma ho ereditato una determinata situazione...

  4. #4
    dal manuale mysql...
    Note: There can be only one AUTO_INCREMENT column per table, it must be indexed, and it cannot have a DEFAULT value. As of MySQL 3.23, an AUTO_INCREMENT column works properly only if it contains only positive values. Inserting a negative number is regarded as inserting a very large positive number. This is done to avoid precision problems when numbers ``wrap'' over from positive to negative and also to ensure that you don't accidentally get an AUTO_INCREMENT column that contains 0.
    Quel numerazzo e' il max value per un INT SIGNED.






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

  5. #5

  6. #6
    un'ultima cosa:
    qual'è il modo migliore di ricreare un campo chiave autoincrement? Ho pensato che per risolvere il problema precedente mi basta ricostruire appunto questo campo con dei valore "decenti"

  7. #7
    [supersaibal]Originariamente inviato da Gianni_T
    un'ultima cosa:
    qual'è il modo migliore di ricreare un campo chiave autoincrement? Ho pensato che per risolvere il problema precedente mi basta ricostruire appunto questo campo con dei valore "decenti" [/supersaibal]
    dipende se hai dei legami con altre tabelle.... Ammettiamo per esempio che la tabella e' per i fatti suoi, magari costruita con dati presi qua e la' con cancellazioni ecc.... e non ci sono vincoli sulla chiave primaria... mo io faccio cosi'.

    1) tolgo l'auto increment
    2) cancello la chiave primaria.
    3) rinomino la colonna
    4) aggiungo una colonna id con alter table INT e UNSIGNED.
    4) modifica con alter table il nuovo campo id assegnandogli autoincrement e chiave primaria.

    quando esegui la query ti verranno automaticamente popolati tutti gli id. puoi anche partire da un valore predefinito, oppure dopo fai un update spiazzando l'id + 1000 tanto per esempio... personalmente non voglio l'id iniziante da 1...

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

  8. #8
    che ne dici di:

    alter table mia_tabella,
    change `id` `id_temp` int (11) NOT NULL,
    drop primary key,
    add column `id` int NOT NULL AUTO_INCREMENT,
    add primary key (`id` ),
    drop column `id_temp`

  9. #9
    a INT devi dare un valore o mi pare che ti fallisce... e aggiungerei UNSIGNED

    non lo faccio sovente ma ultimamente recuperando tabelle ho assegnato id a partire da determinati range in modo da avere valori nettamente diversi... ho fatto tutto con phpmyadmin estremamente comodo. Mi pare ci sia tutto comunque ....

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

  10. #10
    ho provato, non posso cancellare un campo che verrà creato nella stessa query...

    così funziona:

    alter table tabella,
    change `id` `id_temp` int (11) NOT NULL,
    drop primary key

    alter table tabella,
    add column `id` int NOT NULL AUTO_INCREMENT first,
    add primary key (`id` ),
    drop column `id_temp`,
    type=MyISAM auto_increment=1 row_format=dynamic

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 © 2025 vBulletin Solutions, Inc. All rights reserved.