Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 13.12.2018, 13:54
Аватар для xShift
Профессор
Отправить личное сообщение для xShift Посмотреть профиль Найти все сообщения от xShift
 
Регистрация: 22.11.2016
Сообщений: 212

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

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

Может кто знает как ALTER навернуть на такие таблицы, когда они уже заполнены. Автоинкремент там не был присвоен.
Ответить с цитированием
  #2 (permalink)  
Старый 13.12.2018, 14:25
Профессор
Отправить личное сообщение для laimas Посмотреть профиль Найти все сообщения от laimas
 
Регистрация: 14.01.2015
Сообщений: 12,989

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

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. из-за того, что индексы уже идут не поп порядку? - в базе вообще в навал все, а индексы хранятся отдельно, а что касается значений, то уникальный с автоинкрементом означает, что некоторых значений вообще может и не быть, удалены, и они больше базой использоваться не будут.

Последний раз редактировалось laimas, 13.12.2018 в 14:41.
Ответить с цитированием
  #3 (permalink)  
Старый 13.12.2018, 14:35
Аватар для Vlasenko Fedor
Профессор
Отправить личное сообщение для Vlasenko Fedor Посмотреть профиль Найти все сообщения от Vlasenko Fedor
 
Регистрация: 13.03.2013
Сообщений: 1,572

Проверьте таблицу на дубликаты поля
SELECT  GROUP_CONCAT(id) AS ids, COUNT(*) AS cnt
FROM youTable
GROUP BY id
HAVING cnt > 1
Ответить с цитированием
  #4 (permalink)  
Старый 13.12.2018, 14:44
Аватар для SuperZen
Профессор
Отправить личное сообщение для SuperZen Посмотреть профиль Найти все сообщения от SuperZen
 
Регистрация: 08.11.2017
Сообщений: 641

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

Последний раз редактировалось SuperZen, 13.12.2018 в 14:46.
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Добавить ID и class таблице kolhoz jQuery 4 10.07.2015 12:50