2010-09-26 14 views
41

Ho una tabella mysql con le seguenti colonne:Utilizzare più colonne come identificatore univoco per mysql

group_id 
game_id 
user_id 
message 
last_update 

voglio fare in modo che possano esistere nessun due righe in cui il valore di group_id per riga x è uguale al valore di group_id per la riga y E anche il valore di user_id per la riga x è uguale al valore di user_id per la riga y.

Così, per esempio, diciamo che inserisco i seguenti valori seguenti:

group_id = 783 
game_id = 34 
user_id = 29237 
message = none 
last_update = 11233452 

I dati di cui sopra, anche se una query mysql cerca di inserirla, non dovrebbe creare una nuova riga se una riga esiste già con la stessa combinazione di group_id e user_id. C'è un modo per fare questo? Fondamentalmente, sto cercando di far lavorare due colonne come un indice univoco.

+0

C'è qualche ragione per cui group_id e user_id non sono le chiavi primarie per questa tabella? – Gus

+0

Sono impostati come indici, ma l'impostazione su primaria fa la differenza per il tentativo di eseguire l'attività? Se è così, posso renderli principali. – user396404

risposta

82

Sì, MySQL offre la possibilità di farlo.

ALTER TABLE MyTable 
ADD UNIQUE KEY `my_unique_key` (`group_id`, `user_id`) 

Non so che cosa si sta utilizzando questa tabella per, ma suona come questa chiave unica potrebbe essere un candidato forte per la chiave primaria della tabella. Anche una chiave primaria è automaticamente una chiave univoca. Se si decide di farne la chiave primaria, quindi effettuare le seguenti invece:

ALTER TABLE MyTable 
ADD PRIMARY KEY (`group_id`, `user_id`) 

(. Se si riceve un messaggio di errore che v'è già una chiave primaria, quindi emettere ALTER TABLE MyTable DROP PRIMARY KEY e quindi ripetere il comando precedente)

Edit: In risposta al commento all'utente

non si può avere più righe con identiche NULL valori non per le colonne coperti dalla chiave univoca. Quindi non puoi avere due righe dove, per esempio, group_id = 0 AND user_id = 5. 0 è un valore. Ma se rendi una o entrambe le colonne nullable, puoi avere più righe identiche fino al posizionamento di NULL s. Quindi potresti avere due (o più) righe dove group_id IS NULL AND user_id = 1234.

Proviso: quanto sopra vale per entrambi i motori di archiviazione MySQL di uso comune (MyISAM e InnoDB). MySQL ha motori di archiviazione in cui NULL è considerato come un valore univoco, ma probabilmente non li stai utilizzando.

Se si rende nullable una o entrambe le colonne, la chiave univoca non può essere la chiave primaria - una chiave primaria deve essere sulle colonne che sono NOT NULL.

Supponiamo che tu abbia fatto di questa chiave la tua chiave primaria e ora vuoi consentire NULL nella colonna group_id. Non so quale tipo di dati è group_id al momento; Suppongo che sia attualmente INT UNSIGNED NOT NULL, ma dovrai modificare il seguente se non è questo. Non saresti più in grado di utilizzare questa chiave come chiave primaria. Ecco un comando da eseguire per apportare le modifiche desiderate:

ALTER TABLE MyTable 
    DROP PRIMARY KEY, 
    MODIFY group_id INT UNSIGNED, 
    ADD UNIQUE KEY `my_unique_key_with_nulls` (`group_id`, `user`) 
+1

Grazie mille. – user396404

+0

È possibile farlo in modo che funzionino solo insieme come chiave primaria/unica solo se group_id! = '0'? – user396404

+0

Vedi risposta modificata – Hammerite

0

bene per questo è possibile creare la chiave composita di group_id e user_id utilizzando qualsiasi editor mysql come phpmyadmin o sqlyog e contrassegnarlo come indice univoco.

Problemi correlati