2014-12-05 3 views
0

У меня здесь довольно большая проблема ... У нас есть база данных MySQL с таблицей, содержащей более 26 миллионов строк. Теперь проблема в том, что мой Java-код генерирует первичные ключи (с помощью аннотации Hibernate), поскольку в столбце нет флага auto_increment. (Не знаю, почему)Добавление AUTO_INCREMENT в существующий столбец в огромной таблице

Эта установка может периодически возникать проблемы, такие как нарушения ограничений в столбце PK. Я хотел бы изменить его так, чтобы MySQL генерировал автоматически увеличивающиеся PK.

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

С уважением

+0

Я предлагаю вам попробовать его на небольшом образце таблицы в качестве временной таблицы. Я был бы удивлен, если бы он вообще не перестраивался. Вам нужно будет установить следующее значение ключа автоинкремента после того, как вы переопределите его как таковое. – EJP

ответ

0

Да, это довольно просто. Во-первых, вы должны узнать, что ваш hightest индекс:

SELECT max(id_column) FROM your_table; 

Затем изменить таблицу автоприращение

ALTER TABLE your_table CHANGE COLUMN id_column AUTO_INCREMENT; 
ALTER TABLE your_table AUTO_INCREMENT = the_value_from_above + 1; 

Я не 100% уверен, что точный синтаксис, так что вы может захотеть проверить here или использовать MySQL Workbench. Это не приведет к восстановлению таблицы, просто измените метаданные.

Имейте в виду, что вам также нужно сделать спящий режим в курсе auto_increment.

+0

Это заставит MySQL скопировать всю таблицу во временную таблицу, после чего она внесут изменения и скопирует их. Поверьте мне, это не сработает. Это займет до 12 часов, из-за нашего огромного объема данных в этой таблице –

+0

О, я был абсолютно уверен, что этого не будет! Может быть, это зависит от версии или движка таблицы? Как насчет взлома табличных определений напрямую. У вас есть тестовая система, не так ли? – Chris

+0

Мы используем INNODB, и мы попытались запустить аналогичный вопрос, который сделал то, что я прокомментировал выше :( –

Смежные вопросы