MySQL - Предотвратить повторяющиеся записи в таблице через индекс? - PullRequest
4 голосов
/ 18 ноября 2009

Использование MySQL 5

У меня есть такая таблица:

date (varchar)
door (varchar)
shift (varchar)
route (varchar)
trailer (varchar)
+ other fields

Эта таблица содержит сгенерированный пользователем контент (скопированный из другой основной таблицы), и чтобы пользователи не могли создавать одни и те же данные более чем в 1 раз, таблица имеет уникальный индекс, созданный на основе указанных выше полей.

Проблема в том, что индекс "дублирования предотвращения" не работает.
Пользователи по-прежнему могут добавлять дубликаты записей без ошибок.

Это проблема из-за того, что я не понимаю, как работают индексы?

Или

Возможен ли конфликт с полем первичного ключа (автоинкремент int)?

CREATE TABLE выглядит так:

CREATE TABLE /*!32312 IF NOT EXISTS*/ "tableA" (
"Date" varchar(12) default NULL,
"door" varchar(12) default NULL,
"Shift" varchar(45) default NULL,
"route" varchar(20) default NULL,
"trailer" varchar(45) default NULL,
"fieldA" varchar(45) default NULL,
"fieldB" varchar(45) default NULL,
"fieldC" varchar(45) default NULL,
"id" int(10) unsigned NOT NULL auto_increment,
PRIMARY KEY  ("id"),
UNIQUE KEY "duplicate_preventer" ("Date","door","Shift","route","trailer"),

Дублированная строка:

date       door  shift      route    trailer

10/4/2009  W17   1st Shift  TEST-01  NULL
10/4/2009  W17   1st Shift  TEST-01  NULL

Ответы [ 3 ]

6 голосов
/ 18 ноября 2009

Пользователи по-прежнему могут добавлять дубликаты записей без сообщений об ошибках.

Что вы подразумеваете под "дубликатами"?

В зависимости от сопоставления, регистр, акцент и т. Д. Могут иметь значение, и 'test' и 'TEST' не будут считаться дубликатами.

Не могли бы вы опубликовать результаты SHOW CREATE TABLE mytable?

Кроме того, не могли бы вы выполнить этот запрос:

SELECT  date, door, shift, route, trailer
FROM    mytable
GROUP BY
        date, door, shift, route, trailer
HAVING  COUNT(*) > 1

Если он возвращает строки, проблема с индексом; если это не так, проблема в том, что вы определили «дубликат».

Обновление:

Ваши столбцы позволяют NULL с.

NULL значения в MySQL не считаются дублирующими с точки зрения индекса UNIQUE:

CREATE TABLE testtable (door VARCHAR(20), shift VARCHAR(15), UNIQUE KEY (door, shift));

INSERT
INTO    testtable
VALUES
('door', NULL),
('door', NULL);

SELECT  door, shift
FROM    testtable
GROUP BY
        door, shift
HAVING  COUNT(*) > 1;

Из документации :

Индекс UNIQUE создает ограничение, так что все значения в индексе должны быть различны. При попытке добавить новую строку со значением ключа, совпадающим с существующей строкой, возникает ошибка. Это ограничение не распространяется на значения NULL, за исключением механизма хранения BDB. Для других механизмов индекс UNIQUE допускает несколько значений NULL для столбцов, которые могут содержать NULL. Если вы задаете значение префикса для столбца в индексе UNIQUE, значения столбца должны быть уникальными в пределах префикса.

3 голосов
/ 18 ноября 2009

Вы уверены, что используете уникальный индекс вместо обычного индекса?

create unique index uix on my_table (date, door, shift, route, trailer);

Кроме того, этот вид индекса гарантирует только уникальность комбинации полей, например, вы можете иметь несколько повторяющихся дат, если, например, поле поля отличается в каждой строке. Разница может быть чем-то, что трудно определить, например, пробел в конце значения или разница в нижнем и верхнем регистре.

Обновление: ваш уникальный индекс, кажется, в порядке. Проблема в другом месте.

0 голосов
/ 18 ноября 2009

Я думаю, вы захотите создать уникальное ограничение для полей, которые вы не хотите дублировать. Это, в свою очередь, создаст уникальный индекс.

Как это:

ALTER TABLE YourTable ДОБАВИТЬ КОНСТРАЙНТ

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...