Я знаю, что это не будет работать, попробовал его в различных формах и привел все случаи к сбою. Что самый простой путь состоит в том, чтобы достигнуть следующего результата?
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?
Использовать Подготовленное заявление :
SELECT @max := MAX(ID)+ 1 FROM ABC;
PREPARE stmt FROM 'ALTER TABLE ABC AUTO_INCREMENT = ?';
EXECUTE stmt USING @max;
DEALLOCATE PREPARE stmt;
Хорошо, ребята. Я придумал не очень интуитивное решение. Самое приятное то, что это работает!
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);
Лично я бы, вероятно, использовал либо сценарий оболочки, либо небольшое приложение C # / C ++, либо сценарий PHP / Ruby / Perl, чтобы сделать это в двух запросах:
SELECT MAX (ID) FROM ABC;
ALTER TABLE XYZ AUTO_INCREMENT = <вставить сюда значение, полученное из первого запроса>
Очевидно, будьте осторожны, чтобы новое автоматическое приращение не привело к конфликтам ключей с существующими данными в таблице XYZ
.
Если вы действительно хотите сделать это только в 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
Я создаю сценарий автоматического преобразования базы данных для новой версии моего приложения.
В одной таблице мне нужно было изменить основное поле автоинкремента на другое поле. Поскольку эта страница появлялась первой много раз, пока я искал решение для нее, вот решение, которое в конечном итоге сработало для меня:
-- 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;