Qual è un buon modo per aggiungere un PRIMARY KEY a una grande tabella InnoDB?


8

Ho una tabella con circa 30 milioni di righe in MySQL 5.5 utilizzando il motore di archiviazione InnoDB. Questa tabella ha una chiave esterna che collega a un'altra tabella con circa 3 milioni di righe.

Voglio aggiungere una chiave primaria alla tabella più grande, ma non sono sicuro di come procedere al meglio. Non ci sono colonne esistenti (o set di colonne) che posso usare per questo, quindi come dovrei procedere?

Ho visto alcuni riferimenti a un ID record InnoDB interno, ma non ho trovato se questo è accessibile.

Altrimenti, forse dovrò scaricare e ricaricare i dati, aggiungendo l'id manualmente.

Grazie.


La loro è una combinazione di chiavi nella tabella che è naturalmente unica? In tal caso, potrebbe essere utile una chiave primaria a più colonne.
Justin Dearing il

Sfortunatamente non era possibile tale chiave composita. Altrimenti concordo che avrebbe senso. Ho modificato il post per chiarire che ciò non era possibile.
Wodin,

Risposte:


7

questo potrebbe essere il modo sbagliato di farlo, ma ...

non potresti semplicemente modificare la struttura della tabella,

aggiungere una colonna chiave primaria alla tabella

poi...

scrivere uno script veloce per passare attraverso l'intera tabella

aggiungendo un valore di incremento automatico alla nuova colonna?


2
Grazie per il suggerimento Penso che dovrei aggiungere la colonna come chiave non primaria e poi convertirla in chiave primaria in seguito, ma in realtà ho appena scoperto accidentalmente durante il test su una piccola tabella, che l'aggiunta di una colonna AUTO_INCREMENT (come chiave primaria) riempie automaticamente gli ID. Supponevo che mi avrebbe dato solo un errore, quindi penso che sia la risposta.
Wodin,

se il database è molto utilizzato, è possibile testarlo su una tabella non critica per assicurarsi che non lo blocchi a lungo
Patrick,

@Patrick, grazie per la nota di cautela. Il database non è attualmente in uso e mi aspetto che questo blocchi la tabella per molto tempo.
Wodin,

1
L'ho fatto ALTER TABLE blah ADD id INT NOT NULL AUTO_INCREMENT PRIMARY KEY;e ci sono voluti 2 ore e 18 minuti :) Non ho provato a scrivere sul tavolo durante quel periodo, ma le letture hanno funzionato bene.
Wodin,

1
@Wodin wow, è molto tempo per un comando alter table. felice che abbia funzionato per te.
Patrick,

3

Ecco come mi avvicinerei a questo:

  1. Crea una nuova tabella con la struttura desiderata, incluso PRIMARY KEY con AUTO_INCREMENT e probabilmente un altro campo indicizzato.
  2. Prenditi un tempo morto per fermare tutto il traffico.
  3. Conferma di disporre di un backup legittimo dei tuoi dati.
  4. Copia tutte le tue righe dalla tabella esistente nella tabella di destinazione sfruttando l'incremento automatico per creare i tuoi ID. * ad es. INSERT INTO target_table (col1, col2, ecc.) SELECT (col1, col2, ecc.) DA origin_table; *
  5. Verifica che i dati nella nuova tabella siano accurati.
  6. Rinominare la vecchia tabella in origin_table_BAK.
  7. RENAME target_table in origin_table.
  8. Fumo prova la tua applicazione.
  9. Riapri al traffico.
  10. Dopo il tuo prossimo backup, rilascia origin_table_BAK.

* Nota: se la tabella di origine è InnoDB, i vincoli di chiave esterna verranno mantenuti e sopravviveranno alla ridenominazione. Quindi dovrai fare una modifica per rimediare.


3
Se devi farlo dal vivo, esegui i passaggi 6 e 7 in un singolo RENAME, rendendolo quindi atomico. RENAME TABLE real_name TO vecchio, nuovo TO real_name;
Rick James,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.