2012-04-06 11 views
5

Ho un server MySQL 5 e una tabella in esso con un autoincremento su un campo id (chiave primaria). Ora voglio aggiungere un record in mezzo e quindi devo aumentare tutti gli altri ID di uno. Questo è quello che provato:Incrementa il campo ID autoincremento di uno

UPDATE myTable SET id=id+1 WHERE id >= 53 

Questo non funziona a causa per esempio di un record con id = 52 esiste già. Come posso fare questo? Penso che se dovesse iniziare dall'ultima voce e faccia funzionare gli aggiornamenti. Ma come?

+3

Il primario è destinato a fornire un'identità * * per una riga, non * * ordine di loro. Utilizzare una colonna separata per specificare l'ordine desiderato. Cambiare la chiave primaria per una riga dopo averla inserita ti darà solo problemi. –

+1

Cosa succede se rilasciare e ricreare il campo autoincreament? –

+2

Eliminare e ricreare la colonna (o provare a rinumerare le righe esistenti) non funzionerà, specialmente se hai già usato gli ID come chiave esterna da qualche altra parte. (Interromperà le connessioni alle righe esistenti.) Dovresti davvero ascoltare @MarkByers - "Cambiare la chiave primaria per una riga dopo averla inserita ti darà solo problemi." Vedi anche [questo] (http://stackoverflow.com/questions/2106237/is-there-any-harm-in-resetting-the-auto-increment) QUINTA domanda e le sue risposte. –

risposta

11

non vedo alcuna buona ragione per questo. Solo problemi Prima di eseguire la dichiarazione seguente, controllare se sono state definite le chiavi FOREIGN che fanno riferimento a questo id. Sono impostati su ON UPDATE CASCADE? Inoltre, hai dei trigger correlati a questo tavolo?

Ma in primo luogo prendere in considerazione, perché voi (si pensi) bisogno di questo. Sarà usato per ordinare il tavolo? In tal caso, come indicato da @Mark, è necessario utilizzare una colonna separata per specificare l'ordine desiderato.


Se, tuttavia, si decide che si vuole veramente questo, l'uso:

UPDATE myTable 
SET id = id + 1 
WHERE id >= 53 
ORDER BY id DESC ; 
+0

Non lo uso per l'ordinazione. C'è un modo rapido per verificare le chiavi esterne con MySQL Query Browser? Lo stesso per i trigger ... – testing

+0

Per trovare se ci sono FK ** da ** questa tabella ad altre tabelle, basta usare 'SHOW CREATE TABLE myTable'. Per trovare se ci sono FK ** in ** questa tabella da altri, dovrai usare il database 'information_schema'. –

+1

[Query per trovare le chiavi esterne] (http://stackoverflow.com/questions/7765820/query-to-find-foreign-keys) –

0

immagino qualcosa di simile che funziona:

UPDATE myTable SET id=id+1 WHERE id >= (select id from myTable order by id DESC) 
+0

@Ken: Nonostante sia denominato 'auto _...', è possibile assegnare un valore se non si desidera il valore predefinito auto_incrementato. –

+0

@ypercube: Yuk. E grazie per le informazioni :). Un motivo in più per non usare MySQL (per me, comunque). Eliminando il mio commento sopra. –

+0

AFAIK, lo stesso vale per le colonne Identity in SQL-Server. Ma il comportamento normale è ovviamente non inserire i valori manualmente. –

0

avevo affrontato lo stesso problema. E anche provato con la query di OP e @Romain Hoog. Ma non ci sono riusciti.

Infine, i dati esportati dell'intera tabella in Excel e sono stati eseguiti in Excel (non uno a uno ma utilizzando un trucco che lo rende molto veloce).

quindi preso backup della tabella originale ricreato nuova tabella e dati importati da Excel aggiornati.

+0

Cosa hai fatto in Excel? Semplicemente + 1 come formula? Ho pensato all'esportazione CSV e quindi a modificare i dati qui. Successivamente con 'LOAD DATA INFILE" data.csv "SOSTITUISCI IN TABLE myTable ..." Potrei importare i dati. Come hai fatto? – testing

+0

completato con il segno di trascinamento +. Ho importato i dati con lo strumento dell'interfaccia utente non con LOAD Data. Ma puoi farlo anche con questo. –

+0

Quale strumento di interfaccia utente hai utilizzato? – testing

4

Veloce e sporco lo fai in 2 passaggi.

  • aumento l'id di un numero più alto che tutti gli altri
  • diminuzione tutti gli ID per il numero che si desidera

Come quella

UPDATE myTable SET id=id+10000 WHERE id >= 53 
UPDATE myTable SET id=id-9999 WHERE id >= 53 
Problemi correlati