2013-03-06 10 views
31

Desidero aggiungere una chiave univoca complessa alla tabella esistente. La chiave contiene da 4 campi (user_id, game_id, data, ora). Ma la tabella ha righe non univoche. Capisco che posso rimuovere tutte le date duplicate e successivamente aggiungere una chiave complessa.Come aggiungere una chiave univoca alla tabella esistente (con righe non univoche)

Forse esiste un'altra soluzione senza cercare tutti i dati duplicati. (come aggiungere ignorare univoco, ecc.).

UPD Ho cercato, come posso rimuovere le righe mysql duplicate - penso che sia una buona soluzione. Remove duplicates using only a MySQL query?

+1

Non si può avere duplicati se si crea una chiave univoca. – Tchoupi

risposta

75

Si può fare Yantar avvertita

ALTER TABLE TABLE_NAME ADD Id INT IDENTITY(1,1) PRIMARY KEY 

O

È possibile aggiungere un vincolo

ALTER TABLE TABLE_NAME ADD CONSTRAINT constr_ID UNIQUE (user_id, game_id, date, time) 

Ma penso che a non perdere i dati esistenti, è possibile aggiungere una colonna di indentità e quindi creare una chiave composta.

+0

cos'è una colonna IDENTITY? Non riesco a trovare alcun riferimento nel documento eccetto qualcosa relativo a AUTO_INCREMENT: http://dev.mysql.com/doc/refman/5.7/en/example-auto-increment.html – challet

+1

Come menzionato da @challet la parola chiave in MySQL NON è IDENTITÀ ma AUTO_INCREMENT. http://dev.mysql.com/doc/refman/5.7/en/example-auto-increment.html – MER

2

O creare un ID di incremento automatico o un ID UNICO e aggiungerlo alla chiave naturale di cui si sta parlando con i 4 campi. questo farà ogni riga della tabella unica ...

3

Sto fornendo la mia soluzione con l'ipotesi sulla tua logica aziendale. Di base, nel mio progetto, permetterò al tavolo di memorizzare un solo record per una combinazione di gioco utente. Quindi aggiungerò una chiave composita al tavolo.

PRIMARY KEY (`user_id`,`game_id`) 
+0

No, non fa per me. – yAnTar

7

Ho dovuto risolvere un problema simile. Ho ereditato una grande tabella sorgente da MS Access con quasi 15000 record che non avevano una chiave primaria, che dovevo normalizzare e rendere compatibile con CakePHP. Una convenzione di CakePHP è che ogni tabella ha una chiave primaria, che è la prima colonna e che è chiamata 'id'. La seguente dichiarazione semplice fatto il trucco per me in MySQL 5.5:

ALTER TABLE `database_name`.`table_name` 
ADD COLUMN `id` INT NOT NULL AUTO_INCREMENT FIRST, 
ADD PRIMARY KEY (`id`); 

Questo ha aggiunto una nuova colonna 'id' di tipo intero fronte dei dati esistenti ("PRIMA" di parole chiave). La parola chiave AUTO_INCREMENT incrementa gli ID a partire da 1. Ora ogni set di dati ha un ID numerico univoco. (Senza l'istruzione AUTO_INCREMENT tutte le righe sono popolate con id = 0).

0

Attenzione di aggiungere semplicemente una chiave UNIQUE poiché accetta più di un valore NULL.

4

ALTER TABLE 0_value_addition_setup ADD UNIQUE ( value_code )

+6

Sebbene questo codice possa aiutare a risolvere il problema, non spiega _why_ e/o _how_ che risponde alla domanda. Fornire questo contesto aggiuntivo migliorerebbe significativamente il suo valore educativo a lungo termine. Si prega di [modificare] la risposta per aggiungere una spiegazione, compresi quali limitazioni e ipotesi si applicano. –