MySql non può fare colonna auto_increment

Ho una tabella “Bestelling” con 4 colonne: Id (PK), “KlantId”, “Datum”, “BestellingsTypeId”, ora voglio fare la colonna Id auto_increment, tuttavia, quando cerco di farlo, ottengo questo errore:

ERROR 1062: ALTER TABLE causes auto_increment resequencing, resulting in duplicate entry '1' for key 'PRIMARY'

SQL Statement:

ALTER TABLE `aafest`.`aafest_bestelling` CHANGE COLUMN `Id` `Id` INT(11) NOT NULL AUTO_INCREMENT



ERROR: Error when running failback script. Details follow.



ERROR 1046: No database selected

SQL Statement:

CREATE TABLE `aafest_bestelling` (

  `Id` int(11) NOT NULL,

  `KlantId` int(11) DEFAULT NULL,

  `Datum` date DEFAULT NULL,

  `BestellingstypeId` int(11) DEFAULT NULL,

  PRIMARY KEY (`Id`)

) ENGINE=InnoDB DEFAULT CHARSET=latin1

Qualcuno ha un idea?

  • Ho sperimentato lo stesso problema. Ho appena aggiornato il valore zero per qualcosa di più grande INT, abilitato AUTO_INCREMENT, mentre non c’è nessun valore pari a zero. Poi l’ho messo a zero. Ora che la colonna sia AUTO_INCREMENT e zero. Vado a vedere se questo funziona.



9 Replies
  1. 138

    Questo accadrà se la tabella contiene già un record con id 0 (o negativi). L’aggiornamento di tutti i record esistenti per utilizzare i valori positivi permetterà auto_increment essere impostato in quella colonna.

    Edit: qualcuno ha chiesto come 0 ottenuto in là. Per chiarimenti, il Manuale di Riferimento MySQL afferma che “Per i tipi numerici, il valore di default è 0, con l’eccezione che per intero o in virgola mobile tipi dichiarati con il AUTO_INCREMENT attributo, il valore di default è il valore successivo nella sequenza.” Quindi, se si è eseguito un insert su una tabella senza fornire un valore per il numero di colonna prima della auto_increment è stata attivata, l’impostazione predefinita 0 vorresti essere utilizzato durante l’inserimento. Ulteriori dettagli possono essere trovati presso https://dev.mysql.com/doc/refman/5.0/en/data-type-defaults.html.

    • e poi è possibile modificare l’id a 0 se vuoi
    • Io non consiglio – ho il sospetto che potrebbe causare problemi in seguito
  2. 37

    Anche io ho avuto questo problema quando ho provato a convertire una colonna di auto_increment, dove una fila aveva un valore di 0. Un’alternativa per cambiare il valore 0 temporaneamente via impostazione:

    SET SESSION sql_mode='NO_AUTO_VALUE_ON_ZERO';

    per la sessione.

    Questo ha permesso la colonna da modificare per auto_increment con zero id a posto.

    Zero non è l’ideale e anche io non è di essere utilizzato in una colonna auto_increment. Purtroppo fa parte di un’eredità di set di dati così mi sono bloccato con esso per ora.

    Migliori per annullare l’impostazione (e altri), in seguito, con:

    SET SESSION sql_mode='';

    anche se sarà azzerato quando la sessione corrente del client clsoes.

    Tutti i dettagli sul ‘NO_AUTO_VALUE_ON_ZERO’ impostazione qui.

    • Dal mio punto di vista questo è il più liscio approccio già dati contenente zeri in PK colonne. L’ho apprezzato molto, salvato molto del mio tempo!
    • Questo dovrebbe avere più upvotes rispetto.
    • Anch’io ho avuto in eredità un set di dati con ID 0. Per questi casi, e ho il sospetto che la persona che chiede la domanda aveva lo stesso caso d’uso, quindi questa è la risposta corretta.
  3. 14

    Questo accade quando MySQL non è possibile determinare un corretto valore auto_increment. Nel tuo caso, MySQL scegliere 1 il prossimo valore auto_increment, tuttavia c’è già la riga con il valore in tabella.

    Un modo per risolvere il problema è quello di scegliere un proprio valore auto_increment te:

    ALTER TABLE ... CHANGE COLUMN `Id` `Id` INT(11) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT = 123456;

    (Nota il AUTO_INCREMENT=123456 alla fine.)

    • Esattamente quello che mi serviva. Io non posso credere che questa risposta non sia più in alto nella lista.
  4. 13

    Modifica: non sappiamo esattamente come che potrebbe essere causato, ma ho una soluzione.

    Prima di tutto, creare una nuova tabella come quello vecchio:

    CREATE TABLE aafest_bestelling_new LIKE aafest_bestelling;

    Quindi modificare la colonna

    ALTER TABLE `aafest`.`aafest_bestelling_new` 
    CHANGE COLUMN `Id` `Id` INT(11) NOT NULL AUTO_INCREMENT

    Discarica al nuovo dati:

    INSERT INTO aafest_bestelling_new
     (KlantId, Datum, BestellingTypeId) 
    SELECT 
    KlantId, Datum, BestellingTypeId 
    FROM aafest_bestelling;

    Spostare le tabelle:

    RENAME TABLE 
    aafest_bestelling TO aafest_bestelling_old, 
    aafest_bestelling_new TO aafest_bestelling;

    Forse c’è qualcuno corruzione, e questo potrebbe risolvere anche quello.

    P. S.: Come un olandese, mi raccomando codifica in inglese 😉

    • voi, ma la colonna è già PK, in modo che tutti i valori devono essere unica, giusto?
    • Avere uno sguardo.. ho avuto il mio tabelle MySQL più di una volta in uno stato in cui vincoli di unicità sono stati violati. SELECT Id, COUNT(*) as conteggio From aafest_bestelling GROUP BY Id AVENDO conteggio > 1;
    • e si perde tutti l’integrità, sì
    • -1 questo non dovrebbe essere accettato risposta. Questo errore si verifica quando si dispone di un record con id 0. Se si sbarazzarsi di record con id 0, il auto_increment possono essere aggiunti senza errore. È questa la soluzione. Questo ha accettato di rispondere qui è più complicato e soggetto a errori, può causare problemi di integrità dei dati tra tabelle, e porterà più tempo. È sufficiente rimuovere il record con id 0 e eseguire il tuo alter table di nuovo.
    • come sono tornato a questa pagina, oggi di nuovo, e visto il tuo commento, ho deciso di cambiare accettato di rispondere. Grazie per il feedback!
  5. 9

    Il modo più semplice che ho trovato per risolvere questo problema è quello di impostare prima la tabella AUTO INCREMENT valore prima di modificare la colonna. Basta fare in modo di impostare la funzione di incremento di valore superiore al valore più grande attualmente in colonna:

    ALTER TABLE `aafest`.`aafest_bestelling` 
    AUTO_INCREMENT = 100, 
    CHANGE COLUMN `Id` `Id` INT(11) NOT NULL AUTO_INCREMENT

    Ho provato questo su MySQL 5.7 e ha funzionato alla grande per me.

    • Genio, grazie. Avrebbe tirato i capelli.
    • Questo deve essere selezionato come la risposta corretta, non il metodo di ricreare la tabella!
  6. 2

    Questo accade perché la vostra colonna di chiave primaria ha già valori.

    Come dice errore …

    ALTER TABLE cause auto_increment risequenziazione, con conseguente duplicate entry ‘1’ for key ‘PRIMARY’

    il che significa che la colonna ha già un valore di chiave primaria 1 che quando si auto_increment colonna viene riassegnato causando la duplicazione e la ragione di questo errore

    la soluzione a questo è quello di rimuovere il vincolo primario e quindi svuotare la colonna. Quindi modificare la tabella impostazione della chiave primaria di nuovo, questa volta con un incremento automatico.

    • Buona Idea per sbarazzarsi della colonna e ricreare, soprattutto quando si hanno errori.
  7. 2

    Ho avuto un problema simile. Problema era il tavolo aveva un record con ID = 0 simile a quello che SystemParadox sottolineato. Ho gestito il mio problema con la procedura seguente:

    Seguente procedura:

    1. Aggiornamento dell’id del record da 0 a essere x dove x = MAX(id)+1
    2. Alter table per impostare la chiave primaria e di incremento automatico impostazione
    3. Impostare il valore di inizializzazione per essere x+1
    4. Modifica dell’id del record x torna a 0

    Esempio Di Codice:

    UPDATE foo SET id = 100 WHERE id = 0;
    ALTER TABLE foo MODIFY COLUMN id INT(11) NOT NULL AUTO_INCREMENT;
    ALTER TABLE foo AUTO_INCREMENT = 101;
    UPDATE foo SET id = 0 WHERE id = 100;
  8. 0

    Questo errore si verifica anche se hanno una tabella MyISAM che ha un composito AUTO_INCREMENT PRIMARY KEY e stanno cercando di combinare i tasti

    Per esempio

    CREARE la TABELLA test1 ( 
    `id` int(11) NOT NULL, 
    `ver` int(10) unsigned NOT NULL AUTO_INCREMENT, 
    PRIMARY KEY (`id`,`ver`) 
    ) ENGINE=MyISAM DEFAULT CHARSET=utf8; 
    
    INSERT INTO test1 (`id`, `ver`) VALUES (1,NULL),(1,NULL),(1,NULL), (2,NULL),(2,NULL),(2,NULL); 
    
    ALTER TABLE test1 GOCCIA di CHIAVE PRIMARIA, ADD PRIMARY KEY(`ver`); 
    
  9. 0

    Se la tabella è relativa nuova con pochi record che si può troncare il tavolo per reimpostare i valori di ID:

    TRUNCATE TABLE tablename;

    Utilizzando Eliminare non si azzera i valori di ID.

    DELETE FROM tablename;

    dopo la tabella viene svuotato, è possibile applicare l’autoincrement.

    CHANGE COLUMN `Id` `Id` INT(11) NOT NULL AUTO_INCREMENT

Lascia un commento