избегая дубликатов в MySQL на значениях нескольких столбцов - PullRequest
2 голосов
/ 25 ноября 2011

Я продолжаю писать запросы, чтобы избежать вставки при наличии дубликатов - например,

select * from foobar where bar=barbar and foo=foofoo

, а затем проверка в PHP с помощью mysql_num_rows(), чтобы увидеть, является ли количество результатов> 0, чтобы определить, следует ли продолжить мою вставку.

РЕДАКТИРОВАТЬ: например, скажем, пользователь хочет отправить приглашение другому пользователю. Я хочу убедиться, что в моей таблице приглашений я не добавляю еще одну запись с той же парой invited_id AND game_id. так что это требует какой-то проверки.

это кажется неэффективным (и немного грязным). есть ли лучший способ?

Ответы [ 3 ]

5 голосов
/ 25 ноября 2011

А как насчет уникального индекса?

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

http://dev.mysql.com/doc/refman/5.1/en/create-table.html

EDIT:

Список столбцов формы (col1, col2, ...) создает индекс из нескольких столбцов. Значения индекса формируются путем объединения значений указанных столбцов.

http://dev.mysql.com/doc/refman/5.0/en/create-index.html

2 голосов
/ 25 ноября 2011

В этом случае создайте уникальный индекс для (bar, foo), чтобы при дублировании значения вставка не удалась. Вам просто нужно обработать исключение в php. Таким образом, код становится чище и быстрее.

1 голос
/ 25 ноября 2011

Просто используйте ключ UNIQUE для столбцов и инструкцию INSERT IGNORE для вставки новых строк (дублирующиеся строки игнорируются).

Помните, что ключ UNIQUE не может превышать 1000 байтов, а это означает, что потенциальное количество байтов, содержащихся в полях foo и bar вместе, не может превышать 1000 байтов.Если это создает проблему, просто вставьте MD5 CONCATENATED значения в его собственный столбец во время вставки, например (в PHP) md5 ($ foo. $ Bar), и установите уникальный ключ для этого столбца.

CREATE TABLE  `test_unique` (
  `id` int(10) unsigned NOT NULL auto_increment,
  `foo` varchar(45) default NULL,
  `bar` varchar(45) default NULL,
  PRIMARY KEY  (`id`),
  UNIQUE INDEX `Unique` (`foo`,`bar`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;

INSERT IGNORE INTO `test_unique` VALUES
(1, 'foo1', 'bar1'),
(2, 'foo2', 'bar2');

INSERT IGNORE INTO `test_unique` VALUES
(2, 'foo2', 'bar2');
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...