如何使用另一个表中的MAX值重置MySQL AutoIncrement?

Thi*_*ode 34 mysql sql reset auto-increment

我知道这不起作用,以各种形式尝试并且一直都失败了.实现以下结果的最简单方法是什么?

ALTER TABLE XYZ AUTO_INCREMENT = (select max(ID) from ABC);
Run Code Online (Sandbox Code Playgroud)

这非常适合自动化项目.谢谢!

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?
Run Code Online (Sandbox Code Playgroud)

OMG*_*ies 35

使用准备好的声明:

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

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

  DEALLOCATE PREPARE stmt;
Run Code Online (Sandbox Code Playgroud)

  • `PREPARE stmt FROM'ALTER TABLE XYZ AUTO_INCREMENT =?'`为我生成错误:( (11认同)
  • @ T30我遇到了与“?”相同的错误,为此我在此处发布了一种解决方法(http://stackoverflow.com/a/41466825/2822296) (2认同)

Sae*_*eed 19

按照mysql文档,这在mysql 5.7中适用于我:

SET @m = (SELECT MAX(id) + 1 FROM ABC); 
SET @s = CONCAT('ALTER TABLE XYZ AUTO_INCREMENT=', @m);
PREPARE stmt1 FROM @s;
EXECUTE stmt1;
DEALLOCATE PREPARE stmt1;
Run Code Online (Sandbox Code Playgroud)

  • 如果 ABC 是空表,可能需要“SELECT COALESCE(MAX(id), 0) + 1 FROM ABC”。 (3认同)

小智 8

我正在为我的应用程序的新版本创建一个自动数据库转换脚本.

在一个表中,我需要将主要自动增量字段更改为其他字段.由于这个页面出现了很多次,而我搜索了一个解决方案,这里有一个最终适合我的解决方案:

-- 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;
Run Code Online (Sandbox Code Playgroud)


Anu*_*rag 6

谁有问题PREPARE stmt FROM'ALTER TABLE XYZ AUTO_INCREMENT =?' 可以使用

CREATE PROCEDURE reset_xyz_autoincrement
BEGIN
      SELECT @max := MAX(ID)+ 1 FROM ABC; 
      set @alter_statement = concat('ALTER TABLE temp_job_version AUTO_INCREMENT = ', @max);
      PREPARE stmt FROM @alter_statement;
      EXECUTE stmt;
      DEALLOCATE PREPARE stmt;
END
Run Code Online (Sandbox Code Playgroud)


Art*_*tan 6

重置自动增量 ID。

重置自动增量 ID

根据数据库中的当前值将数据库中的所有自动增量列更新为可能的最小值。我们需要在清理数据库后执行此操作。

存储过程中使用准备好的语句

drop PROCEDURE if exists reset_autoincrement;
DELIMITER //
CREATE PROCEDURE reset_autoincrement (IN schemaName varchar(255))
 BEGIN
    DECLARE done INT DEFAULT FALSE;
    DECLARE o_name VARCHAR(255);
    DECLARE o_table VARCHAR(255);
    DECLARE cur1 CURSOR FOR SELECT COLUMN_NAME, TABLE_NAME FROM information_schema.`COLUMNS` WHERE extra LIKE '%auto_increment%' and table_schema=schemaName;
    DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;
    OPEN cur1;
    read_loop: LOOP
     FETCH cur1 INTO o_name, o_table;

     IF done THEN
       LEAVE read_loop;
     END IF;

  set @qry1 = concat('SELECT MAX(`',o_name,'`) + 1 as autoincrement FROM `',o_table,'` INTO @ai');
  PREPARE stmt1 FROM @qry1;
  EXECUTE stmt1;

  IF @ai IS NOT NULL THEN
      SELECT  o_name, o_table;
   select @qry1;
   select @ai;
   set @qry2 = concat('ALTER TABLE `',o_table,'` AUTO_INCREMENT = ', @ai);
   select @qry2;
   PREPARE stmt2 FROM @qry2;
   EXECUTE stmt2;
  END IF;

    END LOOP;

    CLOSE cur1;
 END //
DELIMITER ;


call reset_autoincrement('my_schema_name');
Run Code Online (Sandbox Code Playgroud)