How to Reset an MySQL AutoIncrement using a MAX value from another table?

前端 未结 8 665
遥遥无期
遥遥无期 2020-12-08 07:04

I know this won\'t work, tried it in various forms and failed all times. What is the simplest way to achieve the following result?

ALTER TABLE XYZ AUTO_INCRE         


        
相关标签:
8条回答
  • 2020-12-08 07:13

    I'm creating an automated database transformation script for a new version of my application.

    In one table, I needed to change the primary auto-increment field to a different field. Since this page came up first many times while I googled a solution for it, here's a solution that eventually worked for me:

    -- 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;
    
    0 讨论(0)
  • 2020-12-08 07:14

    If you really want to do this in MySQL alone, you can just dump the dynamically built alter command to a file on disk and then execute it.

    Like so:

    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 讨论(0)
  • 2020-12-08 07:18

    Who is having problem with PREPARE stmt FROM 'ALTER TABLE XYZ AUTO_INCREMENT = ?' can use

    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
    
    0 讨论(0)
  • 2020-12-08 07:23

    Use a Prepared Statement:

      SELECT @max := MAX(ID)+ 1 FROM ABC; 
    
      PREPARE stmt FROM 'ALTER TABLE ABC AUTO_INCREMENT = ?';
      EXECUTE stmt USING @max;
    
      DEALLOCATE PREPARE stmt;
    
    0 讨论(0)
  • 2020-12-08 07:29

    Ok guys. I have come up with a not so intuitive solution. The best part is that it works!

    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);
    
    0 讨论(0)
  • 2020-12-08 07:31

    Reset Auto Increment IDs.

    http://community.spiceworks.com/scripts/show/3042-reset-auto-increment-ids

    update all auto increment columns in a database to the smallest possible value based on current values in the databases. We needed to do this after cleaning out a database.

    Use a Prepared Statement within a Stored Procedure:

    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');
    
    0 讨论(0)
提交回复
热议问题