Что может вызвать дублирование идентификаторов в поле первичного ключа с автоматическим приращением (mysql) - PullRequest
0 голосов
/ 05 февраля 2009

ПОСТАНОВИЛИ

От разработчика: проблема заключалась в том, что предыдущая версия кода все еще писала в таблицу, в которой вместо автоматического увеличения использовались идентификаторы вручную. Примечание для себя: всегда проверяйте другие возможные места, куда записана таблица.

Мы получаем дубликаты ключей в таблице. Они не вставляются одновременно (с интервалом 6 часов).

Структура таблицы:

CREATE TABLE `table_1` (
  `sales_id` int(10) unsigned NOT NULL auto_increment,
  `sales_revisions_id` int(10) unsigned NOT NULL default '0',
  `sales_name` varchar(50) default NULL,
  `recycle_id` int(10) unsigned default NULL,
  PRIMARY KEY  (`sales_id`),
  KEY `sales_revisions_id` (`sales_revisions_id`),
  KEY `sales_id` (`sales_id`),
  KEY `recycle_id` (`recycle_id`)
) ENGINE= MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=26759 ;

Вставка:

insert into `table_1` ( `sales_name` ) VALUES ( "Blah Blah" )

Мы запускаем MySQL 5.0.20 с PHP5 и используем mysql_insert_id () для получения идентификатора вставки сразу после запроса вставки.

Ответы [ 6 ]

5 голосов
/ 05 февраля 2009

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

Если он поврежден, выполнение проверочных таблиц должно выявить проблему. Вы можете сделать это, запустив:

CHECK TABLE tbl_name

Если он все равно возвращается как поврежденный (обычно говорят, что размер больше, чем должен быть на самом деле), тогда просто выполните следующее, чтобы исправить это:

REPAIR TABLE tbl_name
2 голосов
/ 05 февраля 2009

Мы получаем дубликаты ключей в таблице.

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

Автоинкремент включается только тогда, когда вы пропускаете столбец из INSERT или пытаетесь вставить NULL или ноль. В противном случае вы можете указать значение в операторе INSERT, переопределяя механизм автоинкремента. Например:

INSERT INTO table_1 (sales_id) VALUES (26759);

Если указанное вами значение уже существует в таблице, вы получите сообщение об ошибке.

2 голосов
/ 05 февраля 2009

Как сказал другой; на вашем примере это невозможно.

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

2 голосов
/ 05 февраля 2009

Имеет ли поле sales_id первичный (или уникальный) ключ? Если нет, то, вероятно, что-то еще делает вставки или обновления, которые повторно используют существующие номера. И под «чем-то другим» я имею в виду не просто код; это может быть человек с доступом к базе данных, который делает это случайно.

1 голос
/ 05 февраля 2009

Пожалуйста, опубликуйте результаты этого запроса:

SELECT `sales_id`, COUNT(*) AS `num`
FROM `table_1`
GROUP BY `sales_id`
HAVING `num` > 1
ORDER BY `num` DESC
0 голосов
/ 05 февраля 2009
  • Если у вас есть уникальный ключ в других полях, это может быть проблемой.

  • Если вы достигли наивысшего значения для своего столбца auto_increment, MySQL будет продолжать пытаться повторно вставить его. Например, если sales_id был столбцом tinyint, вы получите двойные ключевые ошибки после достижения идентификатора 127.

...