Mysql
 sql >> Database >  >> RDS >> Mysql

Usa più colonne come identificatore univoco per mysql

Sì, MySQL offre la possibilità di farlo.

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

Non so per cosa stai usando questa tabella, ma sembra che questa chiave univoca potrebbe essere un valido candidato per la chiave primaria della tabella. Una chiave primaria è automaticamente anche una chiave univoca. Se decidi di impostarla come chiave primaria, procedi come segue:

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

(Se ricevi un messaggio di errore che indica che esiste già una chiave primaria, emetti ALTER TABLE MyTable DROP PRIMARY KEY e quindi ripetere il comando precedente.)

Modifica: In risposta al commento dell'utente

Non puoi avere più righe con identico non NULL valori per le colonne coperte dalla chiave univoca. Quindi non puoi avere due righe dove group_id = 0 AND user_id = 5 , Per esempio. 0 è un valore. Ma se rendi una o entrambe le colonne annullabili, puoi avere più righe identiche fino al posizionamento di NULL S. Quindi potresti avere due (o più) righe in cui group_id IS NULL AND user_id = 1234 .

Condizione: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 un valore unico, ma probabilmente non li stai utilizzando.

Se rendi una o entrambe le colonne annullabili, la tua chiave univoca non può essere la chiave primaria:una chiave primaria deve trovarsi su colonne che sono NOT NULL .

Supponiamo che tu abbia impostato questa chiave come chiave primaria e ora desideri consentire NULL nel group_id colonna. Non so quale tipo di dati group_id è al momento; Presumo che sia attualmente INT UNSIGNED NOT NULL , ma dovrai modificare quanto segue se non è questo. Non sarai più in grado di utilizzare questa chiave come chiave primaria. Ecco un comando che puoi 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`)