Сегодня я столкнулся с одной из самых странных вещей с MySQL, которые я видел. У меня простая таблица:
CREATE TABLE `features`
(
`feature_id` mediumint(6) unsigned NOT NULL AUTO_INCREMENT,
`feature_name` varchar(100) CHARACTER SET latin1 COLLATE latin1_general_cs NOT NULL,
PRIMARY KEY (`feature_id`),
UNIQUE KEY `feature_name_key` (`feature_name`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=latin1 COLLATE=latin1_general_ci;
Я вставляю данные внутрь с помощью библиотеки Java и mysql-connector-java-5.1.15. Данные в feature_name могут дублироваться, и мне нужны только уникальные значения. Я могу использовать INSERT IGNORE, но если данные слишком длинные, я могу их пропустить, поэтому использую следующее:
pstmt = conn.prepareStatement(
"INSERT INTO features (feature_name) VALUES (?)" );
for ( String featureName: data4db.keySet() )
{
pstmt.setString(1, featureName );
try
{
pstmt.executeUpdate();
}
catch ( SQLException se )
{
if ( se.getErrorCode() == 1062 ) // duplicate entry
{
continue; // ignore
}
throw se; // do not ignore anything else
}
}
После того, как данные были вставлены в базу данных, я заметил, что возникли некоторые проблемы, которых я даже не ожидал. В таблице выше примерно 4000 записей, и это нормально. Единственная проблема заключается в том, что некоторые данные не могут быть вставлены из-за дублирования первичного ключа, поэтому я посмотрел, как выглядят значения auto inc для этой таблицы. Оказывается, для большинства данных id следующих соседних строк был увеличен на 1, как и ожидалось. По той причине, что я не знаю, иногда feature_id увеличивался на 3, 5, 1000, 100000 - полностью случайное значение. Следовательно, у меня «закончилось место в этой таблице», поскольку она не может быть вставлена, когда id достигнет максимального значения для среднего int.
Как это может произойти? Кто-нибудь сталкивался с чем-то подобным? Стоит сказать, что в эту таблицу была только одна программа с одним потоком. У меня есть еще одна таблица, почти идентичная - ширина столбцов и имена разные. Для этого есть аналогичная проблема.
Кстати - еще несколько данных:
mysql> show global variables like 'auto_inc%';
+--------------------------+-------+
| Variable_name | Value |
+--------------------------+-------+
| auto_increment_increment | 1 |
| auto_increment_offset | 1 |
+--------------------------+-------+
2 rows in set (0.01 sec)
mysql> show global variables like 'ver%';
+-------------------------+------------------------------+
| Variable_name | Value |
+-------------------------+------------------------------+
| version | 5.5.10 |
| version_comment | MySQL Community Server (GPL) |
| version_compile_machine | x86 |
| version_compile_os | Win32 |
+-------------------------+------------------------------+
Заранее благодарим вас за любые подсказки.