MySQL дубликат 'ID' = 0 и не может поставить AUTO_INCREMENT на - PullRequest
0 голосов
/ 14 ноября 2018

Я занят переносом старого сайта на новый хостинг. Сейчас это почти сделано, но что-то пошло не так с базой данных, некоторые первичные ключи не идут AUTO_INCREMENT. Так что теперь у меня есть много дублированных идентификаторов 0.

Есть ли способ в SQL, который я могу обновить все идентификаторы где = 0, чтобы плюс те? Последний идентификатор, который заполнен хорошо, это "2108", поэтому следующий идентификатор должен быть "2109", а после этого ++ их.

SELECT * FROM `x9i8Z_yoast_seo_links` WHERE `id` = 0

Пожалуйста, помогите мне:)

1 Ответ

0 голосов
/ 14 ноября 2018

До решения MySQL 8.0.2 будет использоваться Пользовательские переменные . Поскольку в вашем случае порядок не важен, мы можем определить значение последовательного номера строки напрямую (не беспокоясь о порядке). Он будет начинаться с значения «последний хороший идентификатор» + 1. Затем мы обновим значение id для строк, где значение id равно 0.

UPDATE `x9i8Z_yoast_seo_links` AS t
CROSS JOIN (SELECT @rn := 2108) AS user_init -- 2108 is your "last good id" 
SET t.id = (@rn := @rn + 1)
WHERE t.id = 0

Демонстрация - Схема (MySQL v5.7)

create table test
(id int);

insert into test 
values (1),(2),(3),(4),(0),(0),(0),(0);

Запрос № 1: Данные перед операцией обновления

select * from test;

| id  |
| --- |
| 1   |
| 2   |
| 3   |
| 4   |
| 0   |
| 0   |
| 0   |
| 0   |

Запрос № 2: Операция обновления выполнена

update test AS t
cross join (select @rn := 4) AS user_init 
set t.id = (@rn := @rn + 1)
where t.id = 0;

Запрос № 3: Данные после выполнения операции обновления

select * from test;

| id  |
| --- |
| 1   |
| 2   |
| 3   |
| 4   |
| 5   |
| 6   |
| 7   |
| 8   |

Посмотреть на скрипку БД

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...