Я хочу знать, могу ли я повторно заполнить автоинкрементное значение в mysql.
Поскольку, у меня есть записи, которые выглядят подобными:
ID Name
1 POP
3 OLO
12 lku
В основном я хочу способ обновить идентификатор к этому
ID Name
1 POP
2 OLO
3 lku
Там какой-либо путь состоит в том, чтобы сделать это в mysql?
Спасибо.
Не стоит подделывать первичные ключи - лучше позволить БД самой справиться с этим. Могут возникнуть проблемы, если между 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
со старыми и новыми идентификаторами, которую вы можете использовать для обновления зависимостей внешних ключей в других таблицах (на тестовом сервере!)
Вы можете попробовать что-то вроде ...
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 не будет конфликтовать с тройками, так как тройки уже были понижены до двойки.
Менять первичный ключ - очень плохая идея, поскольку это ставит под угрозу ссылочную целостность (что если другая таблица использует id без внешнего ключа с надлежащим "on change"?).
Если вам очень, очень нужно это сделать и вас не волнуют плохие побочные эффекты:
Warning:
Это повредит все другие таблицы, которые имеют внешние ключи к этой таблице (но если бы у вас были такие ключи, вы бы не делали этого в любом случае).