Pregunta

Sé que esto no va a funcionar, lo intentaron en varias formas y fracasaron todos los tiempos. ¿Cuál es la forma más sencilla de lograr el siguiente resultado?

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

Esto es ideal para proyectos de automatización. Gracias!

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?
¿Fue útil?

Solución

Utilizar un Declaración preparada :

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

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

  DEALLOCATE PREPARE stmt;

Otros consejos

la documentación de MySQL , esto funcionó para mí en 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;

Estoy creando una secuencia de comandos de transformación de base de datos automatizada para una nueva versión de mi aplicación.

En una mesa, que tenía que cambiar el campo de incremento automático primaria a un campo diferente. Desde esta página se le ocurrió primeros muchas veces mientras que googled una solución para ello, he aquí una solución que finalmente funcionó para mí:

-- 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;

que está teniendo un problema con PREPARACIÓN DE prop 'ALTER TABLE XYZ AUTO_INCREMENT =? puede utilizar

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

Restablecer ID de incremento automático.

http://community.spiceworks.com/scripts/ Mostrar / 3042-reset-autoincrementación-ids

actualizar todas las columnas de incremento automático en una base de datos para el valor más pequeño posible en función de los valores actuales de las bases de datos. Que teníamos que hacer esto después de la limpieza de una base de datos.

Utilice una declaración preparada dentro de un procedimiento almacenado:

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');

Ok chicos. He llegado a una solución no tan intuitivo. La mejor parte es que funciona!

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);

En lo personal yo probablemente utilizar un script de shell o una aplicación poco de C # / C ++ o script PHP / Ruby / Perl para hacer esto en 2 consultas:

  • Coge el valor que desea SELECT MAX(ID) FROM ABC;
  • Alterar la tabla con el valor ALTER TABLE XYZ AUTO_INCREMENT = <insert value retrieved from first query here>

Obviamente ser cuidadosos de que el nuevo incremento automático no causará ningún enfrentamientos clave con los datos existentes en la tabla XYZ.

Si realmente quiere hacer esto en MySQL solos, sólo puede volcar el comando alter dinámicamente construida en un archivo en el disco y luego ejecutarlo.

Al igual que:

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

Yo no soy más que un aficionado, pero tengo una punta :-) Si te llena la tabla completa con nuevos datos, sólo se puede utilizar antes de llenar:

mysql_query( "TRUNCATE TABLE `your_table`" ) or die( mysql_error());

Es decir, es también restablece AUTO_INCREMENT (y borra todo el contenido; Sí, mesa permanecerá).

Puede copia de seguridad de formar sus datos, la truncar después de inserción en esto sin identificación.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top