[Pregunta]: Update en un ID AUTO_INCREMENT

Iniciado por Leguim, 26 Julio 2019, 18:00 PM

0 Miembros y 1 Visitante están viendo este tema.

EdePC

- Por defecto los PRIMARY KEY son siempre NOT NULL y UNIQUE, no tendría sentido ni posibilidad el tener una Clave Primaria con valores repetidos o nulos XD, me parece que WHK no interpretó bien la estructura de la tabla (ver tabla abajo).

- Aunque al final lo que se quiere lograr es rescatar los valores de los campos de un registro, eliminar dicho registro y volverlo a insertar para que tenga un id generado nuevo. Esto lo puedes hacer tal cual entendiendo esto o atacarlo de otras maneras, por ejemplo usar variables para rescatar los valores, eliminar el registro, cambiar los valores de las variables ser necesario, e insertar el nuevo registro preparado.

-- Por ejemplo:

mysql> DESCRIBE animals;
+-------+-------------+------+-----+---------+----------------+
| Field | Type        | Null | Key | Default | Extra          |
+-------+-------------+------+-----+---------+----------------+
| id    | int(11)     | NO   | PRI | NULL    | auto_increment |
| name  | varchar(20) | YES  |     | NULL    |                |
+-------+-------------+------+-----+---------+----------------+
2 rows in set (0.00 sec)

mysql> SELECT * FROM animals;
+----+------+
| id | name |
+----+------+
|  1 | cat  |
|  2 | dog  |
|  3 | rat  |
|  4 | bull |
|  5 | lion |
+----+------+
5 rows in set (0.00 sec)

mysql> SELECT @id := id, @name := name FROM animals WHERE id = 3;
+-----------+---------------+
| @id := id | @name := name |
+-----------+---------------+
|         3 | rat           |
+-----------+---------------+
1 row in set (0.01 sec)

mysql> SELECT @id;
+------+
| @id  |
+------+
|    3 |
+------+
1 row in set (0.00 sec)

mysql> SELECT @name;
+-------+
| @name |
+-------+
| rat   |
+-------+
1 row in set (0.00 sec)

mysql> SET @name = 'tiger';
Query OK, 0 rows affected (0.00 sec)

mysql> SELECT @name;
+-------+
| @name |
+-------+
| tiger |
+-------+
1 row in set (0.00 sec)

mysql> DELETE FROM animals WHERE id = @id;
Query OK, 1 row affected (0.05 sec)

mysql> INSERT INTO animals ( name ) VALUES ( @name );
Query OK, 1 row affected (1.23 sec)

mysql> SELECT * FROM animals;
+----+-------+
| id | name  |
+----+-------+
|  1 | cat   |
|  2 | dog   |
|  4 | bull  |
|  5 | lion  |
|  6 | tiger |
+----+------+
5 rows in set (0.00 sec)



WHK

Te estás ahogando en un vaso de agua. Si vas a hacer inserción manual de identificadores te meterás en un problema bastante complicado ya que para eso existen los bloqueos de tabla. En bases de datos con muchos registros comenzarán a duplicarse los identificadores porque mientras que calculas el valor para autoincrementar vendrá otra conexión en paralelo y hará el mismo calculo haciendo que ambos registros guarden el mismo valor provocando que el último no se pueda escribir.

Por eso mysql de manera nativa realiza un bloqueo de tablas para reservar su uso mientras realiza el calculo de autoincremento, a demás de eso cuenta con una pila interna de instrucciones para evitar que peticiones asyncronas obtengan un mismo identificador.

Primero lo primero, todos tus id de todas las tablas deben ser autoincrementables, luego debes tomar el valor máximo y dárselo como subquery, evita en lo posible utilizar variables y procedimientos almacenados.

Si es una base de datos nueva entonces eliminala y vuelvela a crear con las propiedades que corresponden.

Saludos.

MinusFour

Creo que es muy raro que Update no actualize el registro para auto incrementar en la tabla. Pero si es así, la única forma va tener que ser reinsertar los valores en la tabla. Yo lo he probado con MariaDB 10.4 y los inserts funcionan bien después de hacer un update al campo primario. De todas formas, poniendo NULL en UPDATE no funciona.

MAX puede funcionar pero se vuelve mas complicado si quieres actualizar multiples registros a la vez. Yo creo que sería mejor volver a reinsertar los valores.

Francamente, no le veo valor a actualizar la ID de los registros.