Come posso specificare un vincolo univoco per più colonne in MySQL?
-
10-07-2019 - |
Domanda
Ho una tabella:
table votes (
id,
user,
email,
address,
primary key(id),
);
Ora voglio rendere le colonne utente, email, indirizzo uniche (insieme).
Come posso farlo in MySql?
- Naturalmente l'esempio è solo ... un esempio. Quindi, per favore, non preoccuparti della semantica.
Soluzione
ALTER TABLE `votes` ADD UNIQUE `unique_index`(`user`, `email`, `address`);
Altri suggerimenti
Ho una tabella MySQL:
CREATE TABLE `content_html` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`id_box_elements` int(11) DEFAULT NULL,
`id_router` int(11) DEFAULT NULL,
`content` mediumtext COLLATE utf8_czech_ci NOT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `id_box_elements` (`id_box_elements`,`id_router`)
);
e UNIQUE KEY funziona esattamente come previsto, consente più righe NULL di id_box_elements e id_router.
Sto eseguendo MySQL 5.1.42, quindi probabilmente c'è stato qualche aggiornamento sulla questione discussa sopra. Fortunatamente funziona e speriamo che rimanga tale.
Gli indici univoci a più colonne non funzionano in MySQL se si dispone di un valore NULL in riga poiché MySQL considera NULL come un valore univoco e almeno attualmente non ha alcuna logica per aggirarlo negli indici a più colonne. Sì, il comportamento è folle, perché limita molte applicazioni legittime di indici multi-colonna, ma è quello che è ... Al momento, è un bug che è stato contrassegnato con "non risolverà". sulla traccia di bug di MySQL ...
Hai provato questo?
UNIQUE KEY `thekey` (`user`,`email`,`address`)
Funziona con mysql versione 5.5.32
ALTER TABLE `tablename` ADD UNIQUE (`column1` ,`column2`);
Puoi aggiungere indici univoci a più colonne tramite phpMyAdmin . (Ho testato nella versione 4.0.4)
Vai alla pagina struttura per la tabella di destinazione. Aggiungi un indice univoco a una delle colonne. Espandi l'elenco Indici nella parte inferiore della pagina della struttura per visualizzare l'indice univoco appena aggiunto. Fai clic sull'icona di modifica e nella finestra di dialogo seguente puoi aggiungere colonne aggiuntive a quell'indice univoco.
MySql 5 o versioni successive si comporta in questo modo (ho appena testato):
- è possibile definire vincoli univoci che coinvolgono colonne nullable. Supponi di definire un vincolo univoco (A, B) in cui A non è nullable ma B è
- quando si valuta un tale vincolo si può avere (A, null) quante volte si desidera (stesso valore A!)
- puoi avere solo una coppia (A, non nulla B)
Esempio: PRODUCT_NAME, PRODUCT_VERSION "bicchiere", null "bicchiere", null "vino", 1
Ora se provi a inserire nuovamente ('wine' 1) segnalerà una violazione del vincolo Spero che questo aiuti
Lo faccio in questo modo:
CREATE UNIQUE INDEX index_name ON TableName (Column1, Column2, Column3);
La mia convenzione per un nome_indice
univoco è TableName_Column1_Column2_Column3_uindex
.
Se vuoi evitare duplicati in futuro. Crea un'altra colonna dire id2.
UPDATE tablename SET id2 = id;
Ora aggiungi il carattere unico su due colonne:
alter table tablename add unique index(columnname, id2);
Per aggiungere un indice univoco sono richiesti:
1) nome_tabella
2) nome_indice
3) colonne su cui si desidera aggiungere l'indice
ALTER TABLE `tablename`
ADD UNIQUE index-name
(`column1` ,`column2`,`column3`,...,`columnN`);
Nel tuo caso possiamo creare un indice univoco come segue:
ALTER TABLE `votes`ADD
UNIQUE <votesuniqueindex>;(`user` ,`email`,`address`);
Se stai creando una tabella in mysql, usa quanto segue:
create table package_template_mapping (
mapping_id int(10) not null auto_increment ,
template_id int(10) NOT NULL ,
package_id int(10) NOT NULL ,
remark varchar(100),
primary key (mapping_id) ,
UNIQUE KEY template_fun_id (template_id , package_id)
);