2011-11-03 12 views
8

Così quando si prova ad aggiungere un autoincremento a un campo, viene visualizzato con # 1062 - Duplica voce "1" per la chiave 1. Ho provato a rimuovere la chiave primaria e riaggiungerla e funziona bene (presumo che non ci sarebbe se ci fossero duplicati?)# 1062 - Duplica voce "1" per la chiave 1 - Nessuna voce duplicata trovata

Ma quando provo ad aggiungere un autoincremento al campo si genera un errore. Mi dà un'opzione Sfoglia che corre il seguente SQL:

SELECT * 
FROM `myTbl` 
WHERE CONCAT_WS("-", 11) = "1" 
ORDER BY 11 
LIMIT 0 , 30 

Tuttavia, questo restituisce un set di risultati vuoto .. suggerendo non ci sono duplicati. Quindi se non ci sono duplicati, come mai non posso aggiungere un autoincremento?

+0

Cosa ti aspetti dal risultato di 'CONCAT_WS (" - ", 11)'? Ho sempre 11 anni ... – glglgl

+0

Per favore pubblica il risultato di 'SHOW CREATE TABLE myTbl' e il comando che usi per aggiungere l'autoincremento. Si noti inoltre che 'CONCAT_WS ('-', 11) = '1'' valuterà sempre a' FALSE'. Non è possibile utilizzare l'ordinale del campo nella clausola 'WHERE' nel modo in cui lo si fa in 'ORDER BY'. – Quassnoi

+0

Quindi non pensate che io sia stupido, non ho scritto quell'SQL - è stato generato da phpMyAdmin quando si preme il pulsante Sfoglia dopo aver generato l'errore. Penso che il poster sottostante (Michael Mior) abbia ragione e ora sto provando questa soluzione. – Ashley

risposta

20

Hai righe con valore 0 o NULL per questa colonna? ALTER TABLE può causare la risincronizzazione delle chiavi primarie. Nel caso di una chiave di 0, MySQL proverà a dargli il valore 1, che fallirà se la chiave 1 esiste già.

Provare a modificare qualsiasi valore 0 o NULL nella colonna a qualcosa di più alto (e non utilizzato).

+0

@Micheal, ciò che accade se si tenta di inserire uno 0 nel PK dipende dalla modalità SQL in cui si trova MySQL. Se è nella modalità rilassata old-skool, non sostituirà 1, ma darà il successivo incremento automatico. Se è nella modalità strict raccomandata, inserisce '0'. – Johan

+0

@Johan Buon punto. Tuttavia, ho ancora il sospetto che questo risolva il problema. –

+0

Questo ha funzionato - aveva uno 0 in là; Grazie! – Ashley

0
SELECT *       <<-- Select * is an anti-pattern 
FROM myTbl 
WHERE CONCAT_WS("-", 11) = "1" <<-- You are not selecting a column 
ORDER BY 11      <<-- This however does refer to a column. 
LIMIT 30 OFFSET 0 

riscrivere la query per

SELECT field1, field2, field3, ...., field11 
FROM myTbl 
WHERE COALESCE(field1, field2, field3, field11) = '1' 
ORDER BY field11    
LIMIT 30 OFFSET 0 

Se si desidera inserire un codice uso di fila in questo modo:

INSERT INTO table1 (/*do not list the PK!*/ field2, field3, field4) 
    VALUES ('a', 'test' ,'b' ,'example'); 

Se si desidera selezionare tutte le righe duplicate usano:

SELECT id, count(*) as duplicate_count 
FROM table1 
GROUP BY id 
HAVING duplicate_count > 1 

È necessario aggiornare tali ID che sono elencati come duplicati.

Un'altra opzione è aggiungere una colonna in più e rilasciare il vecchio PK.

ALTER TABLE table1 ADD COLUMN new_id unsigned integer not null auto_increment primary key; 
ALTER TABLE table1 DROP COLUMN id; 
ALTER TABLE table1 CHANGE COLUMN newid id; 
+0

A meno che non sia frainteso, il problema è che l'OP non può aggiungere "AUTO_INCREMENT" a una colonna. Non vedo come questo risolva il problema. –

2

La risposta di Michael Mior funziona se è possibile modificare i dati nella tabella. Tuttavia, esiste anche una soluzione alternativa che consente di mantenere intatti i dati (l'ho provato su MySQL 5.5). Ricorda che avere un valore zero come chiave primaria in MySQL non è una pratica consigliata solo per questo motivo. Se riesci a sbarazzarti dello zero, fallo.

disabilitare la generazione del valore automatica quando è inserito uno zero:

SET SQL_MODE=NO_AUTO_VALUE_ON_ZERO; 

Aggiungi AUTO_INCREMENT per la colonna:

ALTER TABLE ... AUTO_INCREMENT; 

Riattivare generazione di valore automatica:

SET SQL_MODE=''; 

Dovrebbe essere ovvio che l'inserimento di dati nella tabella durante l'intera operazione non può essere consentito. Altrimenti ci saranno valori zero indesiderati nella colonna.

Problemi correlati