Cómo obtener la siguiente identificación en mysql para insertarla en la tabla
INSERT INTO payments (date, item, method, payment_code)
VALUES (NOW(), '1 Month', 'paypal', CONCAT("sahf4d2fdd45", id))
Cómo obtener la siguiente identificación en mysql para insertarla en la tabla
INSERT INTO payments (date, item, method, payment_code)
VALUES (NOW(), '1 Month', 'paypal', CONCAT("sahf4d2fdd45", id))
Respuestas:
Úselo LAST_INSERT_ID()
desde su consulta SQL.
O
También puede usar mysql_insert_id()
para obtenerlo usando PHP.
LAST_INSERT_ID()
.
mysqli_insert_id
Puedes usar
SELECT AUTO_INCREMENT
FROM information_schema.tables
WHERE table_name = 'table_name'
AND table_schema = DATABASE( ) ;
o si no desea utilizar information_schema, puede utilizar este
SHOW TABLE STATUS LIKE 'table_name'
TABLES.AUTO_INCREMENT
se almacena en caché dev.mysql.com/doc/refman/8.0/en/… . El blog de Mysql también tiene varias publicaciones al respecto, pero la variable del sistema que mencionan parece obsoleta: mysqlserverteam.com/… mysqlserverteam.com/…
Puede obtener el siguiente valor de incremento automático haciendo lo siguiente:
SHOW TABLE STATUS FROM tablename LIKE Auto_increment
/*or*/
SELECT `auto_increment` FROM INFORMATION_SCHEMA.TABLES
WHERE table_name = 'tablename'
Tenga en cuenta que usted debe no usar esto para modificar la tabla, utilice una columna AUTO_INCREMENT de hacerlo de forma automática en su lugar.
El problema es que last_insert_id()
es retrospectivo y, por tanto, se puede garantizar dentro de la conexión actual.
Este bebé es prospectivo y, por lo tanto, no es único por conexión y no se puede confiar en él.
Solo en una base de datos de conexión única funcionaría, pero las bases de datos de conexión única de hoy tienen la costumbre de convertirse en bases de datos de conexión múltiple mañana.
Ver: SHOW TABLE STATUS
insert into table_name (field1, field2) select 'constant', auto_increment from information_schema.tables where table_name = 'table_name'
? after insert
last_insert_id()
UPDATE
si tuviera también. Pero prefiero concatenar los dos en el momento de la visualización y ahorrar toda la molestia.
SHOW TABLE STATUS
espera ver database name
después FROM
y 'table name pattern'
después LIKE
.
Esto devolverá el valor de incremento automático para la base de datos MySQL y no verifiqué con otras bases de datos. Tenga en cuenta que si está utilizando cualquier otra base de datos, la sintaxis de la consulta puede ser diferente.
SELECT AUTO_INCREMENT
FROM information_schema.tables
WHERE table_name = 'your_table_name'
and table_schema = 'your_database_name';
SELECT AUTO_INCREMENT
FROM information_schema.tables
WHERE table_name = 'your_table_name'
and table_schema = database();
La respuesta principal usa PHP MySQL_ para una solución, pensé que compartiría una solución PHP MySQLi_ actualizada para lograr esto. ¡No hay salida de error en este ejemplo!
$db = new mysqli('localhost', 'user', 'pass', 'database');
$sql = "SHOW TABLE STATUS LIKE 'table'";
$result=$db->query($sql);
$row = $result->fetch_assoc();
echo $row['Auto_increment'];
Lanza el siguiente incremento automático que aparece en una tabla.
En PHP puedes probar esto:
$query = mysql_query("SELECT MAX(id) FROM `your_table_name`");
$results = mysql_fetch_array($query);
$cur_auto_id = $results['MAX(id)'] + 1;
O
$result = mysql_query("SHOW TABLE STATUS WHERE `Name` = 'your_table_name'");
$data = mysql_fetch_assoc($result);
$next_increment = $data['Auto_increment'];
Solución:
CREATE TRIGGER `IdTrigger` BEFORE INSERT ON `payments`
FOR EACH ROW
BEGIN
SELECT AUTO_INCREMENT Into @xId
FROM information_schema.tables
WHERE
Table_SCHEMA ="DataBaseName" AND
table_name = "payments";
SET NEW.`payment_code` = CONCAT("sahf4d2fdd45",@xId);
END;
"DataBaseName" es el nombre de nuestra base de datos
Puedes usar el disparador de mysql
payment_code
en el after insert
disparador parece ser la mejor opción.
No puede usar el ID mientras lo inserta, ni tampoco lo necesita. MySQL ni siquiera conoce el ID cuando inserta ese registro. Podrías simplemente guardar "sahf4d2fdd45"
en la payment_code
tabla y usar id
y payment_code
más adelante.
Si realmente necesita que su payment_code tenga la ID, ACTUALICE la fila después de la inserción para agregar la ID.
information_schema.tables
tabla.
SELECT ... CONCAT(payment_code, id)
, o en su código de aplicación. Incluso puede envolver el SELECT
en a VIEW
, para que siempre devuelva el valor correcto, sin preocuparse por el CONCAT en cada SELECCIÓN de su aplicación.
¿Para qué necesita el próximo ID incremental?
MySQL solo permite un campo de incremento automático por tabla y también debe ser la clave principal para garantizar la exclusividad.
Tenga en cuenta que cuando obtenga el siguiente ID de inserción, es posible que no esté disponible cuando lo use, ya que el valor que tiene está solo dentro del alcance de esa transacción. Por lo tanto, dependiendo de la carga en su base de datos, es posible que ese valor ya se haya utilizado para cuando llegue la siguiente solicitud.
Le sugiero que revise su diseño para asegurarse de que no necesita saber qué valor de incremento automático asignar a continuación
Sugiero que reconsidere lo que está haciendo. Nunca experimenté un solo caso de uso en el que se requiera ese conocimiento especial. La siguiente identificación es un detalle de implementación muy especial y no contaría con que sea seguro para ACID.
Haga una transacción simple que actualice su fila insertada con la última identificación:
BEGIN;
INSERT INTO payments (date, item, method)
VALUES (NOW(), '1 Month', 'paypal');
UPDATE payments SET payment_code = CONCAT("sahf4d2fdd45", LAST_INSERT_ID())
WHERE id = LAST_INSERT_ID();
COMMIT;
utilice "mysql_insert_id ()". mysql_insert_id () actúa sobre la última consulta realizada, asegúrese de llamar a mysql_insert_id () inmediatamente después de la consulta que genera el valor.
A continuación se muestra el ejemplo de uso:
<?php
$link = mysql_connect('localhost', 'username', 'password');
if (!$link) {
die('Could not connect: ' . mysql_error());
}
mysql_select_db('mydb');
mysql_query("INSERT INTO mytable VALUES('','value')");
printf("Last inserted record has id %d\n", mysql_insert_id());
?>
Espero que el ejemplo anterior sea útil.
mysql_insert_id();
Eso es :)
SELECT id FROM `table` ORDER BY id DESC LIMIT 1
Aunque dudo de su productividad pero es 100% confiable
usando la respuesta de ravi404:
CREATE FUNCTION `getAutoincrementalNextVal`(`TableName` VARCHAR(50))
RETURNS BIGINT
LANGUAGE SQL
NOT DETERMINISTIC
CONTAINS SQL
SQL SECURITY DEFINER
COMMENT ''
BEGIN
DECLARE Value BIGINT;
SELECT
AUTO_INCREMENT INTO Value
FROM
information_schema.tables
WHERE
table_name = TableName AND
table_schema = DATABASE();
RETURN Value;
END
usando en su consulta de inserción, para crear un Hash SHA1. ex.:
INSERT INTO
document (Code, Title, Body)
VALUES (
sha1( getAutoincrementalNextval ('document') ),
'Title',
'Body'
);
Mejora de @ ravi404, en caso de que su compensación de autoincremento NO ES 1:
SELECT (`auto_increment`-1) + IFNULL(@@auto_increment_offset,1)
FROM INFORMATION_SCHEMA.TABLES
WHERE table_name = your_table_name
AND table_schema = DATABASE( );
( auto_increment
-1): db engine parece que siempre considera un desplazamiento de 1. Por lo tanto, debe deshacerse de esta suposición, luego agregar el valor opcional de @@ auto_increment_offset, o por defecto a 1: IFNULL (@@ auto_increment_offset, 1)
Para mí funciona y parece simple:
$auto_inc_db = mysql_query("SELECT * FROM my_table_name ORDER BY id ASC ");
while($auto_inc_result = mysql_fetch_array($auto_inc_db))
{
$last_id = $auto_inc_result['id'];
}
$next_id = ($last_id+1);
echo $next_id;//this is the new id, if auto increment is on
$last_id
repetidamente cuando puede DESC
. Tu while
bloque hizo un montón de trabajo inútil.
auto_increment
columna