у меня такая таблица
| Я БЫ | НАЗВАНИЕ |
|---|---|
| 1 | МАЙКЛ |
| 2 | ИОРДАНИЯ |
| 5 | ДОНАЛЬД |
| 7 | ДЖЕЙС |
| 8 | РОЙ |
| 11 | ДЖОН |
| 16 | Министерство энергетики |
Есть ли способ пересчитать идентификатор с самого начала, чтобы было продолжение и сохранить остальные столбцы нетронутыми, чтобы они были такими:
| Я БЫ | НАЗВАНИЕ |
|---|---|
| 1 | МАЙКЛ |
| 2 | ИОРДАНИЯ |
| 3 | ДОНАЛЬД |
| 4 | ДЖЕЙС |
| 5 | РОЙ |
| 6 | ДЖОН |
| 7 | Министерство энергетики |
Благодарю вас!
нет необходимости в последовательных идентификаторах






Если ваша версия MySQL поддерживает функцию окна, вы можете использовать ROW_NUMBER.
Предположим, у вас есть следующая таблица:
create table test(
ID int NOT NULL ,
NAME VARCHAR (25)
);
insert into test values
(1,'MICHAEL'),
(2,'JORDAN'),
(5,'DONALD'),
(7,'JAYCE'),
(8,'ROY'),
(11,'JOHN'),
(16,'DOE');
Использование row_number даст:
select ID,NAME, row_number() over(order by ID ASC ) as rownum
from test
Result:
ID NAME rownum 1 MICHAEL 1 2 JORDAN 2 5 DONALD 3 7 JAYCE 4 8 ROY 5 11 JOHN 6 16 DOE 7
Теперь создайте еще одну таблицу test2.
create table test2(
ID int NOT NULL ,
NAME VARCHAR (25)
);
Мы можем использовать INSERT INTO SELECT:
INSERT INTO test2( ID, NAME )
WITH cte AS (
select ID,NAME, row_number() over(order by ID ASC ) as rownum
from test t1
)
SELECT rownum,NAME
FROM cte;
select * from test2;
Result:
ID NAME 1 MICHAEL 2 JORDAN 3 DONALD 4 JAYCE 5 ROY 6 JOHN 7 DOE
См. рабочий пример
Вы можете получить свои записи с помощью PHP, проверить наименьший
free ID, проверить следующий наименьшийfilled ID. обновить наборfilled ID = free IDи продолжить проверку со следующего наименьшегоfree ID