Ho due tavoli già esistenti che sembrano (in parte) più o meno in questo modo:Modifica chiave primaria MySQL quando vincoli di chiave esterna esiste
CREATE TABLE parent (
old_pk CHAR(8) NOT NULL PRIMARY KEY
) ENGINE=InnoDB;
CREATE TABLE child (
parent_key CHAR(8),
FOREIGN KEY (parent_key) REFERENCES parent(old_pk)
ON UPDATE CASCADE ON DELETE CASCADE
) ENGINE=InnoDB;
voglio aggiungere un nuovo intero incremento automatico id
colonna parent
e usarlo invece come chiave primaria, mantenendo allo stesso tempo old_pk
come chiave univoca e consentendo ad altre tabelle come child
di fare riferimento a contorni di chiave esterna. Purtroppo, semplicemente dicendo ALTER TABLE parent DROP PRIMARY KEY
non funziona:
Codice errore: 1025
Errore ridenominazione del './data/#sql-4013_70f5e' a './data/parent' (errno: 150
Alcuni googling suggeriscono che ciò è dovuto al riferimento di chiave esterna esistente da child
. In sostanza, ho bisogno di un modo per dire a MySQL "usa questa altra colonna come chiave primaria, ma non dimenticare la chiave univoca di quella originale". C'è un modo per farlo, oltre a eliminare i vincoli principali da child
e ripristinarli in seguito?
Si supponga di dover modificare le tabelle in luogo, anziché creare copie con gli stessi dati e scambiarle successivamente. Ho provato a utilizzare SET FOREIGN_KEY_CHECKS = 0
prima di modificare la tabella, ma non sembra essere di aiuto.
è per questo che non faccio chiave primaria visibile all'utente (Sono tutti per chiave primaria surrogata da il go-go), i requisiti di modifica dell'utente sono un mal di testa, ma è bene sapere che stai facendo in modo che il tuo database usi la chiave primaria sostitutiva http://en.wikipedia.org/wiki/Surrogate_key –