Comment obtenir le prochain identifiant dans mysql pour l'insérer dans la table
INSERT INTO payments (date, item, method, payment_code)
VALUES (NOW(), '1 Month', 'paypal', CONCAT("sahf4d2fdd45", id))
Comment obtenir le prochain identifiant dans mysql pour l'insérer dans la table
INSERT INTO payments (date, item, method, payment_code)
VALUES (NOW(), '1 Month', 'paypal', CONCAT("sahf4d2fdd45", id))
Réponses:
Utilisez à LAST_INSERT_ID()
partir de votre requête SQL.
Ou
Vous pouvez également l'utiliser mysql_insert_id()
pour l'obtenir en utilisant PHP.
LAST_INSERT_ID()
.
mysqli_insert_id
Vous pouvez utiliser
SELECT AUTO_INCREMENT
FROM information_schema.tables
WHERE table_name = 'table_name'
AND table_schema = DATABASE( ) ;
ou si vous ne souhaitez pas utiliser information_schema, vous pouvez utiliser ceci
SHOW TABLE STATUS LIKE 'table_name'
TABLES.AUTO_INCREMENT
est mis en cache dev.mysql.com/doc/refman/8.0/en/… . Le blog Mysql a également plusieurs articles à ce sujet, mais le système varaible qu'ils mentionnent semble obsolète: mysqlserverteam.com /
Vous pouvez obtenir la prochaine valeur d'incrémentation automatique en faisant:
SHOW TABLE STATUS FROM tablename LIKE Auto_increment
/*or*/
SELECT `auto_increment` FROM INFORMATION_SCHEMA.TABLES
WHERE table_name = 'tablename'
Notez que vous ne devez pas l' utiliser pour modifier la table, utilisez plutôt une colonne auto_increment pour le faire automatiquement.
Le problème est qu'il last_insert_id()
est rétrospectif et peut donc être garanti dans la connexion actuelle.
Ce bébé est potentiel et n'est donc pas unique par connexion et ne peut être invoqué.
Cela ne fonctionnerait que dans une seule base de données de connexion, mais les bases de données à connexion unique ont aujourd'hui l'habitude de devenir plusieurs bases de données de connexion demain.
Voir: SHOW TABLE STATUS
insert into table_name (field1, field2) select 'constant', auto_increment from information_schema.tables where table_name = 'table_name'
? J'utiliserais la mise à jour dans le after insert
déclencheur et last_insert_id()
, bien que ...
UPDATE
si j'avais aussi. Mais je préfère simplement concaténer les deux au moment de l'affichage et économiser tous les tracas.
SHOW TABLE STATUS
s'attend à voir database name
après FROM
et 'table name pattern'
après LIKE
.
Cela renverra la valeur d'incrémentation automatique pour la base de données MySQL et je n'ai pas vérifié avec d'autres bases de données. Veuillez noter que si vous utilisez une autre base de données, la syntaxe de la requête peut être différente.
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 meilleure réponse utilise PHP MySQL_ pour une solution, je pensais que je partagerais une solution PHP MySQLi_ mise à jour pour y parvenir. Il n'y a pas de sortie d'erreur dans cet exemple!
$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'];
Lance le prochain incrément automatique dans une table.
En PHP, vous pouvez essayer ceci:
$query = mysql_query("SELECT MAX(id) FROM `your_table_name`");
$results = mysql_fetch_array($query);
$cur_auto_id = $results['MAX(id)'] + 1;
OU
$result = mysql_query("SHOW TABLE STATUS WHERE `Name` = 'your_table_name'");
$data = mysql_fetch_assoc($result);
$next_increment = $data['Auto_increment'];
Solution:
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" est le nom de notre base de données
Vous pouvez utiliser le déclencheur mysql
payment_code
à jour dans le after insert
déclencheur semble être la meilleure option.
Vous ne pouvez pas utiliser l'ID lors de l'insertion, vous n'en avez pas non plus besoin. MySQL ne connaît même pas l'ID lorsque vous insérez cet enregistrement. Vous pouvez simplement enregistrer "sahf4d2fdd45"
dans le payment_code
tableau et utiliser id
et payment_code
plus tard.
Si vous avez vraiment besoin que votre code de paiement contienne l'ID, METTEZ à JOUR la ligne après l'insertion pour ajouter l'ID.
information_schema.tables
tableau.
SELECT ... CONCAT(payment_code, id)
, soit dans votre code d'application. Vous pouvez même encapsuler le SELECT
dans un VIEW
, afin de toujours renvoyer la bonne valeur, sans vous soucier du CONCAT dans chaque SELECT de votre application.
Pourquoi avez-vous besoin du prochain ID incrémentiel?
MySQL n'autorise qu'un champ auto-incrémenté par table et il doit également être la clé primaire pour garantir l'unicité.
Notez que lorsque vous obtenez le prochain ID d'insertion, il peut ne pas être disponible lorsque vous l'utilisez, car la valeur que vous avez est uniquement dans la portée de cette transaction. Par conséquent, en fonction de la charge sur votre base de données, cette valeur peut être déjà utilisée au moment où la prochaine demande arrive.
Je vous suggère de revoir votre conception pour vous assurer que vous n'avez pas besoin de savoir quelle valeur d'incrémentation automatique attribuer ensuite
Je suggère de repenser ce que vous faites. Je n'ai jamais connu un seul cas d'utilisation où ces connaissances spéciales sont requises. L'identifiant suivant est un détail d'implémentation très spécial et je ne compte pas sur le fait qu'il soit sans danger pour l'ACID.
Faites une transaction simple qui met à jour votre ligne insérée avec le dernier identifiant:
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;
utilisez "mysql_insert_id ()". mysql_insert_id () agit sur la dernière requête effectuée, assurez-vous d'appeler mysql_insert_id () immédiatement après la requête qui génère la valeur.
Voici l'exemple d'utilisation:
<?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());
?>
J'espère que l'exemple ci-dessus est utile.
mysql_insert_id();
C'est tout :)
SELECT id FROM `table` ORDER BY id DESC LIMIT 1
Bien que je doute de sa productivité mais c'est 100% fiable
en utilisant la réponse 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
en utilisant dans votre requête d'insertion, pour créer un hachage SHA1. ex.:
INSERT INTO
document (Code, Title, Body)
VALUES (
sha1( getAutoincrementalNextval ('document') ),
'Title',
'Body'
);
Amélioration de @ ravi404, au cas où votre décalage d'auto-incrémentation N'EST PAS 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): le moteur db semble toujours considérer un décalage de 1. Vous devez donc abandonner cette hypothèse, puis ajouter la valeur facultative de @@ auto_increment_offset, ou par défaut à 1: IFNULL (@@ auto_increment_offset, 1)
Pour moi, cela fonctionne et semble 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
répétitive quand vous pouvez juste DESC
. Votre while
bloc a fait des tonnes de travail inutile.
auto_increment
colonne