[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.

Leguim

Buenos días, básicamente quería saber como podría editar un id (AUTO_INCREMENT) de una tabla ya es conocido que son valores únicos e irrepetibles. Lo que busco es que al momento de realizar la consulta, el registro al que intento editar "UPDATE" tenga un id más renovada es decir mas grande como si fuera que cree ese registro por primera vez. Espero haberme podido explicar bien.. Gracias

MinusFour

No estoy muy seguro, pero creo que si utilizas NULL para el campo con AUTO_INCREMENT (y le has puesto NOT_NULL al campo con AUTO_INCREMENT) te genera un nuevo número.

Leguim

Cita de: MinusFour en 26 Julio 2019, 18:34 PM
No estoy muy seguro, pero creo que si utilizas NULL para el campo con AUTO_INCREMENT (y le has puesto NOT_NULL al campo con AUTO_INCREMENT) te genera un nuevo número.

Había buscado en internet antes y se decía algo de que al hacer eso de poner null da un id = 0 pero lo voy a probar haber que tal y te digo.

MinusFour

Cita de: MiguelCanellas en 26 Julio 2019, 18:50 PM
Había buscado en internet antes y se decía algo de que al hacer eso de poner null da un id = 0 pero lo voy a probar haber que tal y te digo.

Va a depender de la base de datos pero está en la documentación de MySQL.



https://dev.mysql.com/doc/mysql-tutorial-excerpt/5.7/en/example-auto-increment.html

WHK

Creo que tu tabla tiene problemas de definición, ejecuta un DESCRIBE nombrdelatabla; y peganos el resultado para ver porque no está incrementando los valores de manera automática.

Leguim

No pude poner el NOT_NULL no se donde tengo que ir para eso.

Cita de: WHK en 26 Julio 2019, 21:05 PM
Creo que tu tabla tiene problemas de definición, ejecuta un DESCRIBE nombrdelatabla; y peganos el resultado para ver porque no está incrementando los valores de manera automática.

Me salió esto..

Field | Type | Null | Key | Default | Extra

id | int(50) | NO | PRI | NULL | auto_increment
nombre | varchar(25) | YES | NULL
apellido | varchar(25) | YES | NULL
email | varchar(200) | YES | NULL
contrasena | varchar(200) | YES | NULL

WHK

Ok...

id | int(50) | NO | PRI | NULL | auto_increment

Tu columna id dice que si es numérico y autoincrementable pero también dice que puede ser nulo y eso está mal, porque si no lo defines al insertar un valor entonces queda nulo en ves de crear el valor numérico autoincrementado.

Debes modificarlo e indicarle que no puede ser nulo:

ALTER TABLE nombredelatabla MODIFY id INT NOT NULL AUTO_INCREMENT PRIMARY KEY;

Ojo, cuando lo hags te dará un error si tienes registros nulos, para aplicar ese cambio debes asignar un valor a cada registro nulo.

Otro cuidado es el valor de inicio del autoincrementable, probablemente la base de datos no ha utilizado la función de autoincremento por lo cual el primer valor a asignar al crear un registro sea el 1 y luego el 2 y así, pero si ya tienes esos valores utilizados entonces tendrás un problema.

Para solucionar esto debes modificar el valor del autoincrementable para que comience a partir del siguiente valor mas grande que tengas:

ALTER TABLE nombredelatabla AUTO_INCREMENT = 100;

Donde 100 es el valor que comenzará a utilizar.

Si quieres saber tu valor máximo actual puedes utilizar:

SELECT MAX(id) FROM nombredelatabla;

A eso le sumas uno y ya.

Para saber si tienes registros nulos:

SELECT * FROM nombredelatabla WHERE id IS NULL LIMIT 100;

Saludos.

Leguim

¡Muchas gracias a los dos por la mano que me dieron con esto!  ;-)
MIL GRACIAS!

EdePC

Saludos,

- He estado haciendo pruebas en mi MySQL 5.6.35 y veo que cuando se actualiza un valor auto_increment usando UPDATE el contador interno que usa MySQL no se actualiza y se queda como estaba, luego de intentar INSERT un nuevo registro da un error ya que el contador se quedo atrás, sin embargo el contador se actualiza luego del error y permite insertar el nuevo registro en el siguiente intento:


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 | dog  |
|  3 | lax  |
|  4 | wolf |
|  7 | cow  |
|  8 | bull |
|  9 | lion |
| 10 | cat  |
+----+------+

mysql> SET @newId = ( SELECT MAX(id) + 1 FROM animals );
Query OK, 0 rows affected (0.00 sec)

mysql> UPDATE animals SET id = @newId, name = 'rat' WHERE name = 'lax';
Query OK, 1 row affected (0.14 sec)
Rows matched: 1  Changed: 1  Warnings: 0

mysql> SELECT * FROM animals;
+----+------+
| id | name |
+----+------+
|  1 | dog  |
|  4 | wolf |
|  7 | cow  |
|  8 | bull |
|  9 | lion |
| 10 | cat  |
| 11 | rat  |
+----+------+
7 rows in set (0.00 sec)

mysql> INSERT INTO animals VALUES ( NULL, 'parrot' );
ERROR 1062 (23000): Duplicate entry '11' for key 'PRIMARY'

mysql> INSERT INTO animals VALUES ( NULL, 'parrot' );
Query OK, 1 row affected (0.15 sec)

mysql> SELECT * FROM animals;
+----+--------+
| id | name   |
+----+--------+
|  1 | dog    |
|  4 | wolf   |
|  7 | cow    |
|  8 | bull   |
|  9 | lion   |
| 10 | cat    |
| 11 | rat    |
| 12 | parrot |
+----+--------+
8 rows in set (0.00 sec)


- Pues habrá que tener esto en cuenta y actualizar el contador a mano como dice WHK usando:

ALTER TABLE animals AUTO_INCREMENT = @newId + 1;

-- PERO no funciona, esa instrucción no soporta variables XD, al menos no en mi MySQL 5.6.35, la alternativa es usar una Sentencia Preparada, los pasos completos a continuación:


mysql> SELECT * FROM animals;
+----+--------+
| id | name   |
+----+--------+
|  4 | wolf   |
|  7 | cow    |
|  8 | bull   |
|  9 | lion   |
| 10 | cat    |
| 11 | rat    |
| 12 | parrot |
| 13 | condor |
| 14 | tiger  |
| 15 | fly    |
+----+--------+
10 rows in set (0.00 sec)

mysql> SET @newId = ( SELECT MAX(id) + 1 FROM animals );
Query OK, 0 rows affected (0.00 sec)

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

mysql> UPDATE animals SET id = @newId, name = 'gorilla' WHERE name = 'rat';
Query OK, 1 row affected (0.14 sec)
Rows matched: 1  Changed: 1  Warnings: 0

mysql> SELECT * FROM animals;
+----+---------+
| id | name    |
+----+---------+
|  4 | wolf    |
|  7 | cow     |
|  8 | bull    |
|  9 | lion    |
| 10 | cat     |
| 12 | parrot  |
| 13 | condor  |
| 14 | tiger   |
| 15 | fly     |
| 16 | gorilla |
+----+---------+
10 rows in set (0.00 sec)

mysql> ALTER TABLE animals AUTO_INCREMENT = @newId + 1;
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '@newId + 1' at line 1

mysql> SET @sql = CONCAT('ALTER TABLE animals AUTO_INCREMENT = ', @newId + 1);
Query OK, 0 rows affected (0.00 sec)

mysql> SELECT @sql;
+-----------------------------------------+
| @sql                                    |
+-----------------------------------------+
| ALTER TABLE animals AUTO_INCREMENT = 17 |
+-----------------------------------------+
1 row in set (0.00 sec)

mysql> PREPARE st FROM @sql; EXECUTE st;
Query OK, 0 rows affected (0.00 sec)
Statement prepared

Query OK, 0 rows affected (0.13 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> INSERT INTO animals VALUES ( NULL, 'mouse' );
Query OK, 1 row affected (0.13 sec)

mysql> SELECT * FROM animals;
+----+---------+
| id | name    |
+----+---------+
|  4 | wolf    |
|  7 | cow     |
|  8 | bull    |
|  9 | lion    |
| 10 | cat     |
| 12 | parrot  |
| 13 | condor  |
| 14 | tiger   |
| 15 | fly     |
| 16 | gorilla |
| 17 | mouse   |
+----+---------+
11 rows in set (0.00 sec)

Leguim

Hola EDE!

Digamos no sirve poner a la columna "id" NOT_NULL y luego ponerlo NULL o sería mejor usar ese método que me mostraste?