Как Сбросить MySQL AutoIncrement с помощью МАКС. значения от другой таблицы?

Я знаю, что это не будет работать, попробовал его в различных формах и привел все случаи к сбою. Что самый простой путь состоит в том, чтобы достигнуть следующего результата?

ALTER TABLE XYZ AUTO_INCREMENT = (select max(ID) from ABC);

Здорово для проектов автоматизации.Спасибо!

SELECT @max := (max(ID)+1) from ABC;        -> This works!
select ID from ABC where ID = (@max-1);     -> This works!
ALTER TABLE XYZ AUTO_INCREMENT = (@max+1);  -> This fails :( Why?
34
задан ThinkCode 9 March 2010 в 17:15
поделиться

5 ответов

Использовать Подготовленное заявление :

  SELECT @max := MAX(ID)+ 1 FROM ABC; 

  PREPARE stmt FROM 'ALTER TABLE ABC AUTO_INCREMENT = ?';
  EXECUTE stmt USING @max;

  DEALLOCATE PREPARE stmt;
35
ответ дан 27 November 2019 в 16:34
поделиться

Хорошо, ребята. Я придумал не очень интуитивное решение. Самое приятное то, что это работает!

SELECT @max := max(ID) from ABC;       
ALTER TABLE XYZ AUTO_INCREMENT = 1;
ALTER TABLE XYZ ADD column ID INTEGER primary key auto_increment;
UPDATE XYZ SET ContactID = (ContactID + @max);
2
ответ дан 27 November 2019 в 16:34
поделиться

Лично я бы, вероятно, использовал либо сценарий оболочки, либо небольшое приложение C # / C ++, либо сценарий PHP / Ruby / Perl, чтобы сделать это в двух запросах:

  • Выберите нужное значение SELECT MAX (ID) FROM ABC;
  • Измените таблицу, используя значение ALTER TABLE XYZ AUTO_INCREMENT = <вставить сюда значение, полученное из первого запроса>

Очевидно, будьте осторожны, чтобы новое автоматическое приращение не привело к конфликтам ключей с существующими данными в таблице XYZ .

1
ответ дан 27 November 2019 в 16:34
поделиться

Если вы действительно хотите сделать это только в MySQL, вы можете просто сбросить динамически созданную команду alter в файл на диске и затем выполнить ее.

Например, так:

select concat('ALTER TABLE XYZ AUTO_INCREMENT = ',max(ID)+1,';') as alter_stmt
into outfile '/tmp/alter_xyz_auto_increment.sql'
from ABC;

\. /tmp/alter_xyz_auto_increment.sql
0
ответ дан 27 November 2019 в 16:34
поделиться

Я создаю сценарий автоматического преобразования базы данных для новой версии моего приложения.

В одной таблице мне нужно было изменить основное поле автоинкремента на другое поле. Поскольку эта страница появлялась первой много раз, пока я искал решение для нее, вот решение, которое в конечном итоге сработало для меня:

-- Build a new ID field from entry_id, make it primary and fix the auto_increment for it:
ALTER TABLE  `entries` ADD  `id` INT UNSIGNED NOT NULL FIRST;
UPDATE entries SET id = entry_id;
ALTER TABLE  `entries` ADD PRIMARY KEY (  `id` );

-- ...the tricky part of it:
select @ai := (select max(entry_id)+1 from entries);
set @qry = concat('alter table entries auto_increment=',@ai);
prepare stmt from @qry; execute stmt;

-- ...And now it's possible to switch on the auto_increment:
ALTER TABLE  `entries` CHANGE  `id`  `id` INT( 10 ) UNSIGNED NOT NULL AUTO_INCREMENT;
8
ответ дан 27 November 2019 в 16:34
поделиться
Другие вопросы по тегам:

Похожие вопросы: