it-swarm.com.de

Wie kann ich in MySQL eine eindeutige Einschränkung für mehrere Spalten angeben?

Ich habe einen Tisch:

table votes (
    id,
    user,
    email,
    address,
    primary key(id),
);

Nun möchte ich die Spalten Benutzer, E-Mail, Adresse eindeutig machen (zusammen).

Wie mache ich das in MySql?

  • Natürlich ist das Beispiel nur ein Beispiel. Machen Sie sich also keine Sorgen über die Semantik.
771
Niyaz
ALTER TABLE `votes` ADD UNIQUE `unique_index`(`user`, `email`, `address`);
1284
jonstjohn

Ich habe eine MySQL-Tabelle:

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`)
);

und der UNIQUE KEY funktioniert genau wie erwartet. Er erlaubt mehrere NULL-Zeilen von id_box_elements und id_router. 

Ich verwende MySQL 5.1.42, daher gab es wahrscheinlich ein Update zu dem oben diskutierten Problem. Zum Glück funktioniert es und hoffentlich bleibt es so.

204
Frodik

Mehrspalten-eindeutige Indizes funktionieren in MySQL nicht, wenn Sie einen NULL-Wert in der Zeile haben, da MySQL NULL als eindeutigen Wert behandelt und zumindest derzeit keine Logik in mehrspaltigen Indizes vorhanden ist. Ja, das Verhalten ist verrückt, weil es viele legitime Anwendungen von mehrspaltigen Indizes einschränkt, aber es ist, was es ist ... Bis jetzt ist es ein Fehler, der mit "wird nicht behoben" auf MySQL gestempelt wurde Bug-Track ...

44
niksoft

Hast du das probiert? 

UNIQUE KEY `thekey` (`user`,`email`,`address`)
23
Erick

Dies funktioniert für MySQL-Version 5.5.32

ALTER TABLE  `tablename` ADD UNIQUE (`column1` ,`column2`);
11
rizon

Sie können über phpMyAdmin mehrere eindeutige Indizes mit mehreren Spalten hinzufügen. (Ich habe in Version 4.0.4 getestet)

Navigieren Sie zur Seite Struktur Ihrer Zieltabelle. Fügen Sie einer der Spalten einen eindeutigen Index hinzu. Erweitern Sie die Liste Indexes unten auf der Strukturseite, um den soeben hinzugefügten eindeutigen Index anzuzeigen. Klicken Sie auf das Bearbeitungssymbol und im folgenden Dialogfeld können Sie diesem eindeutigen Index weitere Spalten hinzufügen.

6
Vince K

MySql 5 oder höher verhält sich so (ich habe es gerade getestet):

  • sie können eindeutige Einschränkungen definieren, die nullfähige Spalten enthalten. Angenommen, Sie definieren eine Einschränkung (A, B), bei der A nicht nullfähig ist, B jedoch
  • wenn Sie eine solche Einschränkung auswerten, können Sie (A, Null) so oft verwenden, wie Sie möchten (gleicher A-Wert!).
  • sie können nur ein Paar (A, nicht Null B) haben

Beispiel: PRODUCT_NAME, PRODUCT_VERSION 'Glass', null 'Glass', null 'Wine', 1

Wenn Sie nun erneut versuchen, ('wine' 1) einzufügen, wird eine Einschränkungsverletzung gemeldet. __ Hoffen Sie, dass dies hilft

5
Cristian Botiza

So mach ich es:

CREATE UNIQUE INDEX index_name ON TableName (Column1, Column2, Column3);

Meine Konvention für einen eindeutigen index_name ist TableName_Column1_Column2_Column3_uindex.

2
LXXIII

Für das Hinzufügen eines eindeutigen Indexes ist Folgendes erforderlich:

1) tabellenname
2) Indexname
3) Spalten, zu denen Sie einen Index hinzufügen möchten 

ALTER TABLE  `tablename` 
ADD UNIQUE index-name
(`column1` ,`column2`,`column3`,...,`columnN`);

In Ihrem Fall können wir einen eindeutigen Index wie folgt erstellen:

ALTER TABLE `votes`ADD 
UNIQUE <votesuniqueindex>;(`user` ,`email`,`address`);
1
sandeep vanama

Wenn Sie in Zukunft Duplikate vermeiden möchten. Erstellen Sie eine weitere Spalte, z. B. id2. 

UPDATE tablename SET id2 = id;

Fügen Sie nun das Unique in zwei Spalten hinzu:

alter table tablename add unique index(columnname, id2);
1
kumar

Wenn Sie eine Tabelle in mysql erstellen, verwenden Sie Folgendes:

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)
);
0