как повторно заполнить/воссоздать автоинкремент в mysql

Я хочу знать, могу ли я повторно заполнить автоинкрементное значение в mysql.

Поскольку, у меня есть записи, которые выглядят подобными:

ID Name
1  POP
3  OLO
12 lku

В основном я хочу способ обновить идентификатор к этому

ID Name
1  POP
2  OLO
3  lku

Там какой-либо путь состоит в том, чтобы сделать это в mysql?

Спасибо.

6
задан JPro 16 March 2010 в 13:24
поделиться

3 ответа

Не стоит подделывать первичные ключи - лучше позволить БД самой справиться с этим. Могут возникнуть проблемы, если между UPDATE и ALTER будет добавлена еще одна запись. Из-за этого вы должны ЗАБЛОКИРОВАТЬ таблицу, что может привести к зависанию других запросов и увеличению нагрузки на загруженный производственный сервер.

LOCK TABLES table WRITE
UPDATE table SET id=3 WHERE id=12;
ALTER TABLE table AUTO_INCREMENT=4;
UNLOCK TABLES 

ИЛИ - для тысяч строк (без зависимостей от внешних ключей):

CREATE TEMPORARY TABLE nameTemp( name varchar(128) not null )
INSERT INTO name SELECT name FROM firstTable
TRUNCATE firstTable
INSERT INTO firstTable SELECT name FROM nameTemp

Последний метод работает только в том случае, если у вас нет внешних ключей. Если они есть, вам потребуется таблица поиска.

CREATE TEMPORARY TABLE lookup( newId INTEGER AUTO_INCREMENT, oldId INTEGER, PRIMARY KEY newId( newId ) );
INSERT INTO lookup (oldId) SELECT id FROM firstTable
[do temp table queries above]

Теперь у вас есть таблица lookup со старыми и новыми идентификаторами, которую вы можете использовать для обновления зависимостей внешних ключей в других таблицах (на тестовом сервере!)

.
5
ответ дан 17 December 2019 в 04:45
поделиться

Вы можете попробовать что-то вроде ...

Create Temporary table MyBackup
(  ID as your autoincrement,
   OldID as Int for backlinking/retention,
   RestOfFields as their type )

insert into MyBackup
(    OldID
     RestOfFields )
select 
     ID as OldID,
     RestOfFields
  from
     YourOriginalTable
  order by
     ID  (this is your original ID)

Тогда у вас будет новая таблица с автоинкрементом и новыми назначенными идентификаторами, но при этом полная копия их оригинального удостоверения личности. Затем вы можете выполнить коррелированные обновления для других таблиц и установить ID = ID, где ID = OldID. Сохраняя порядок вставки по исходному идентификатору, это предотвратит замену номеров вне очереди. Пример: если ваша таблица была упорядочена как Старый идентификатор = 3, новый идентификатор = 1 Старый ID = 1, новый ID = 3 Старый ID = 12, новый ID = 2

Ваши старые тройки станут 1, затем 1 станут тройками, а 12 станут двойками

Старый идентификатор = 1, новый ID = 1 Старый ID = 3, новый ID = 2 Старый ID = 12, новый ID = 3

ваши тройки не будут перезаписывать большее число, а 12 не будет конфликтовать с тройками, так как тройки уже были понижены до двойки.

0
ответ дан 17 December 2019 в 04:45
поделиться

Менять первичный ключ - очень плохая идея, поскольку это ставит под угрозу ссылочную целостность (что если другая таблица использует id без внешнего ключа с надлежащим "on change"?).

Если вам очень, очень нужно это сделать и вас не волнуют плохие побочные эффекты:

  • Создайте вторую таблицу с идентичной структурой
  • INSERT INTO new_table (id, [другие поля]) SELECT NULL, [другие поля] FROM old_table;
  • DROP old_table;
  • RENAME new_table old_table;

Warning:
Это повредит все другие таблицы, которые имеют внешние ключи к этой таблице (но если бы у вас были такие ключи, вы бы не делали этого в любом случае).

0
ответ дан 17 December 2019 в 04:45
поделиться
Другие вопросы по тегам:

Похожие вопросы: