Jak określić unikalne ograniczenie dla wielu kolumn w MySQL?

Mam tabelę:

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

Teraz chcę, aby Kolumny user, email, address były unikalne (razem).

Jak to zrobić w MySql?

  • oczywiście przykład jest sprawiedliwy... przykład. Więc proszę, nie martw się semantyką.
Author: New Alexandria, 2009-03-11

11 answers

ALTER TABLE `votes` ADD UNIQUE `unique_index`(`user`, `email`, `address`);
 1233
Author: jonstjohn,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-06-04 11:46:23

Mam tabelę 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`)
);

I unikalny klucz działa zgodnie z oczekiwaniami, pozwala na wiele wierszy NULL id_box_elements i id_router.

Używam MySQL 5.1.42, więc prawdopodobnie była jakaś aktualizacja w sprawie omówionej powyżej. Na szczęście działa i mam nadzieję, że tak pozostanie.

 194
Author: Frodik,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-04-24 18:44:17

Wielokolumnowe unikalne indeksy nie działają w MySQL, jeśli masz wartość NULL w wierszu, ponieważ MySQL traktuje NULL jako unikalną wartość i przynajmniej obecnie nie ma logiki, aby obejść ją w wielokolumnowych indeksach. Tak zachowanie jest szalone, ponieważ ogranicza wiele legalnych zastosowań indeksów wielokolumnowych, ale jest jak jest... Jak na razie jest to błąd, który został oznaczony "nie naprawi" na ścieżce błędów MySQL...

 43
Author: niksoft,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-05-07 21:21:31

Próbowałeś tego ?

UNIQUE KEY `thekey` (`user`,`email`,`address`)
 22
Author: Erick,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-03-11 19:14:24

To działa dla mysql w wersji 5.5.32

ALTER TABLE  `tablename` ADD UNIQUE (`column1` ,`column2`);
 11
Author: rizon,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-02-05 08:55:56

Możesz dodawać unikalne indeksy w wielu kolumnach za pomocą phpMyAdmin. (Testowałem w wersji 4.0.4)

Przejdź do strony Struktura dla tabeli docelowej. Dodaj unikalny indeks do jednej z kolumn. Rozwiń listę indeksów u dołu strony struktura, aby zobaczyć unikalny indeks, który właśnie dodałeś. Kliknij ikonę Edytuj, a w następnym oknie dialogowym możesz dodać dodatkowe kolumny do tego unikalnego indeksu.

 6
Author: Vince K,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-03-20 00:40:34

MySql 5 lub wyższy zachowuje się tak (właśnie testowałem):

  • możesz definiować unikalne ograniczenia obejmujące nullable columns. Powiedzmy, że definiujesz ograniczenie unikalne (A, B), gdzie A nie jest nullable, ale b jest
  • oceniając takie ograniczenie możesz mieć (a, null) tyle razy ile chcesz (ta sama wartość!)
  • możesz mieć tylko jedną (a, nie null B) parę

Przykład: PRODUCT_NAME, PRODUCT_VERSION "glass", null "glass", null "wino", 1

Teraz jeśli spróbujesz insert ('wine' 1) ponownie zgłosi naruszenie ograniczeń Mam nadzieję, że to pomoże

 4
Author: Cristian Botiza,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-08-03 12:56:47

Jeśli chcesz uniknąć duplikatów w przyszłości. Utwórz kolejną kolumnę powiedz id2.

UPDATE tablename SET id2 = id;

Teraz dodaj unikat na dwóch kolumnach:

alter table tablename add unique index(columnname, id2);
 1
Author: kumar,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-03-09 23:01:40

Do dodania unikalnego indeksu wymagane są:

1) table_name
2) index_name
3) kolumny do których chcesz dodać indeks

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

W Twoim przypadku możemy utworzyć unikalny indeks w następujący sposób:

ALTER TABLE `votes`ADD 
UNIQUE <votesuniqueindex>;(`user` ,`email`,`address`);
 1
Author: sandeep vanama,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-11-22 14:07:03

Robię to tak:

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

Moją konwencją na unikalny index_name jest TableName_Column1_Column2_Column3_uindex.

 1
Author: LXXIII,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-06-27 21:20:18

Jeśli tworzysz tabelę w mysql to Użyj następującego :

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
Author: Devendra Singraul,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-10-09 05:50:17