Javascript-форум (https://javascript.ru/forum/)
-   Серверные языки и технологии (https://javascript.ru/forum/server/)
-   -   Существующей таблице в использовании добавить автоинкремент (https://javascript.ru/forum/server/76211-sushhestvuyushhejj-tablice-v-ispolzovanii-dobavit-avtoinkrement.html)

xShift 13.12.2018 13:54

Существующей таблице в использовании добавить автоинкремент
 
Взял работенку и нарвался на херово спроектированную базу данных. Пытался сделать ALTER TABLE чтобы поле ID получило автоинкремент, который ранее таблице не присвоен. Получаю ошибки типа не может быть такого типа или невозможно выполнить операцию из-за какой-то еще несостыковки. Это из-за чего? Из-за того, что таблица в использовании или из-за того, что индексы уже идут не поп порядку? Есть идеи как решить? Это делает мой код более менее сносным на текущем проекте без костылей.

Задача простенькая. Сделать агрегацию заказов с внешних интернет магазинов на CRM которая использует 2 таблицы для хранения заказа с привязкой ID заказа к ID корзины не очевидным недокументированным образом и не использует автоинкремент по ключевому полю так как было бы должно. Матерюсь и отрыгиваю кислоту в адрес ваятеля, но решить как-то надо и неприятно то, что из-за этой гребаной архитектуры у меня на два SELECT больше чем нужно, чтобы синхронизировать ID.

Может кто знает как ALTER навернуть на такие таблицы, когда они уже заполнены. Автоинкремент там не был присвоен.:-E

laimas 13.12.2018 14:25

Поле с автоинрементом должно иметь либо уникальный индекс, либо быть первичным ключом (также будет иметь уникальный индекс).

ALTER TABLE `table`
  ADD UNIQUE KEY `field` (`field`) /* или ADD PRIMARY KEY  `field` (`field`) */

ALTER TABLE `table`
  MODIFY `field` int(11) UNSIGNED NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=последнее значение поля + 1


То есть значения поля на момент добавления индексов должны быть уникальны, и нужно знать последнее значение, чтобы его + 1 подставить в запрос.

PS. из-за того, что индексы уже идут не поп порядку? - в базе вообще в навал все, а индексы хранятся отдельно, а что касается значений, то уникальный с автоинкрементом означает, что некоторых значений вообще может и не быть, удалены, и они больше базой использоваться не будут.

Vlasenko Fedor 13.12.2018 14:35

Проверьте таблицу на дубликаты поля
SELECT  GROUP_CONCAT(id) AS ids, COUNT(*) AS cnt
FROM youTable
GROUP BY id
HAVING cnt > 1

SuperZen 13.12.2018 14:44

Возможно, сначала надо отключить constraints, сделать alter, потом включить constraints. ) И не забываем что про бэкап... или пересоздать таблички через CREATE TABLE AS SELECT ))


Часовой пояс GMT +3, время: 22:43.