2012-01-19 1 views
2

У меня есть простая таблица tag_map, какINSERT в таблицу с UNIQUE INDEX для двух столбцов

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, чтобы избежать дублирования пар в теге к столбу. Теперь, когда я пытаюсь добавить новые enteries в

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'; это относится к другому тегу и сообщению.

Где я ошибался?

+0

Вставить запрос прямо ?? – Viking

ответ

2

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

MEDIUMINT максимальное значение Вашего PK по 16777215 было достигнуто.

Alter to int or above

+0

очень тонкий взгляд на проблему! большое спасибо за явный ответ! – Googlebot

+0

Ну, вот вам, когда он насмехается, как игла в глазу, и вовсе не тонкая, хорошие путешествия :) – atxdba

0

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).

0

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

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