Вставить в таблицу с уникальным индексом для двух столбцов - PullRequest
2 голосов
/ 19 января 2012

У меня есть простая таблица tag_map как

CREATE TABLE tag_map
(
tag_map_id mediumint(7) unsigned NOT NULL AUTO_INCREMENT,
post_id mediumint(7) unsigned REFERENCES posts(post_id),
tag_id mediumint(7) unsigned REFERENCES tags(tag_id),
UNIQUE INDEX (post_id,tag_id),
PRIMARY KEY(tag_map_id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE utf8_general_ci

Я добавил UNIQUE INDEX, чтобы избежать дублирования пар тегов, связанных с сообщением. Теперь, когда я пытаюсь добавить новые записи как

INSERT IGNORE INTO (post_id,tag_id) VALUES (post1_id,tag1_id), (post1_id, tag2_id),...

Я получу ошибку

ERROR 1062 (23000): Duplicate entry '16777215' for key 'PRIMARY'

но когда я SELECT WHERE tag_map_id = '16777215'; это относится к другому тегу и сообщению.

Где я ошибся?

Ответы [ 3 ]

2 голосов
/ 19 января 2012

http://dev.mysql.com/doc/refman/5.0/en/integer-types.html

Достигнуто максимальное значение мидинта вашего ПК 16777215.

Изменить на int или выше

0 голосов
/ 19 января 2012

Ваш tag_map_id объявлен как таблица PRIMARY KEY. У вас никогда не будет дублированного первичного ключа. Неважно, к какому тегу и посту принадлежит вторая строка: у него один и тот же первичный ключ.

Вам нужно будет изменить схему, если вы хотите, чтобы два элемента с одинаковым tag_map_id, но, скорее всего, вы допустили логическую ошибку в том, что вы пытаетесь выполнить.

0 голосов
/ 19 января 2012

tag_map_id является первичным ключом таблицы и не может быть дублирован. Проверьте SELECT MAX(tag_map_id) FROM tag_map; и значение AUTO_INCREMENT в SHOW CREATE TABLE tag_map;. Второе значение должно быть больше первого. Иногда они могут выйти из синхронизации.

Если значение AUTO_INCREMENT меньше максимального tag_map_id, просто сделайте ALTER TABLE tag_map AUTO_INCREMENT=x;, где x на единицу больше MAX(tag_map_id).

...