Disons que j'ai les données suivantes dans la table Customers: (rien de plus)
ID FirstName LastName
-------------------------------
20 John Mackenzie
21 Ted Green
22 Marcy Nate
Quel type d’instruction SELECT peut me donner le nombre 22, dans la colonne ID?
Je dois faire quelque chose comme ceci pour générer un identifiant unique. Bien sûr, je peux laisser le système procéder par incrémentation automatique, mais comment puis-je obtenir l'ID généré automatiquement?
J'ai pensé à "SELECT ID FROM Customers" et à compter les lignes renvoyées, mais cela semble horriblement inefficace et dans ce cas, il retournera incorrectement "3", bien que j'ai besoin d'un identifiant unique de 23.
Tu peux faire
SELECT MAX(ID) FROM Customers;
Si vous venez d'insérer un enregistrement dans la table Customers et que vous avez besoin de la valeur du champ ID récemment rempli, vous pouvez utiliser la fonction SCOPE_IDENTITY. Cela n'est utile que lorsque l'INSERT s'est produit dans la même étendue que l'appel à SCOPE_IDENTITY.
INSERT INTO Customers(ID, FirstName, LastName)
Values
(23, 'Bob', 'Smith')
SET @mostRecentId = SCOPE_IDENTITY()
Cela peut ou peut ne pas vous être utile, mais c'est une bonne technique à connaître. Cela fonctionnera également avec les colonnes générées automatiquement.
SELECT * FROM Customers ORDER BY ID DESC LIMIT 1
Ensuite, obtenez l'ID.
select max(id) from customers
Pour l'obtenir à tout moment, vous pouvez utiliser SELECT MAX(Id) FROM Customers
.
Cependant, dans la procédure que vous ajoutez, vous pouvez également utiliser SCOPE_IDENTITY
- pour obtenir le dernier identifiant ajouté par cette procédure.
C'est plus sûr, car cela vous garantira d'obtenir votre Id
-- juste au cas où d'autres personnes seraient ajoutées à la base de données en même temps.
Si vous parlez de MS SQL, voici le moyen le plus efficace. Cette opération extrait la graine d’identité actuelle d’une table en fonction de l’identité de la colonne.
select IDENT_CURRENT('TableName') as LastIdentity
Utiliser MAX(id)
est plus générique, mais par exemple, j'ai une table avec 400 millions de lignes qui prend 2 minutes pour obtenir la MAX(id)
. IDENT_CURRENT
est presque instantané ...
select max(id) from Customers
Si vous utilisez AUTOINCREMENT
, utilisez:
SELECT LAST\_INSERT\_ID();
En supposant que vous utilisez Mysql: http://dev.mysql.com/doc/refman/5.0/en/example-auto-increment.html
Postgres gère cela de manière similaire via la fonction currval(sequence_name)
.
Notez que l'utilisation de MAX(ID)
n'est pas sûre, sauf si vous verrouillez la table, car il est possible (dans un cas simplifié) de créer une autre insertion avant d'appeler MAX(ID)
et de perdre l'identifiant de la première insertion. Les fonctions ci-dessus sont basées sur la session, donc si une autre session est insérée, vous obtenez toujours l'ID que vous avez inséré.
Vous pouvez également utiliser l'algèbre relationnelle. Une procédure un peu longue, mais ici, il suffit de comprendre le fonctionnement de MAX ():
E: = πID (Nom de la table)
E1: = πID (σID> = ID ' ((ρID ' E) ⋈ E)) - πID (σID <ID ’ ((ρID ' E) ⋈ E))
Votre réponse: Table_Name ⋈ E1
En gros, vous soustrayez un ensemble de relations ordonnées (a, b) dans lesquelles a<
b de A où a, b ∈ A.
Pour les symboles d’algèbre des relations, voir: Algèbre relationnelle De Wikipedia
Si vous n'utilisez pas de champs auto-incrémentés, vous pouvez obtenir un résultat similaire avec les éléments suivants:
insert into Customers (ID, FirstName, LastName)
select max(ID)+1, 'Barack', 'Obama' from Customers;
Cela garantira qu'il n'y a aucune chance d'une condition de concurrence critique qui pourrait être causée par une autre insertion dans la table entre votre extraction de l'ID maximum et votre insertion du nouvel enregistrement.
Ceci utilise SQL standard, il existe sans doute de meilleures façons de le réaliser avec des SGBD spécifiques, mais ils ne sont pas nécessairement portables (ce que nous prenons très au sérieux dans notre boutique).
Si vous souhaitez simplement sélectionner la variable id
, utilisez select max(id) from customer
.
Si vous souhaitez sélectionner la ligne entière, utilisez une requête comme celle-ci:
select c1.*
from customer c1, (select max(id) as max_id from customer )c2
where c1.id=c2.max_id
c2
est un alias de la nouvelle table temporaire qui contient max id
. Ensuite, son produit croisé est pris avec la table client pour obtenir la ligne entière.
Nous écrivons ici une requête dans la clause from, ce qui peut souvent être très utile.
Cela dépend de l’implémentation SQL que vous utilisez. Par exemple, MySQL et SQLite permettent d’obtenir le dernier identifiant d’insertion. En fait, si vous utilisez PHP, il existe même une fonction astucieuse pour exactement cela mysql_insert_id ().
Vous devriez probablement chercher à utiliser cette fonctionnalité MySQL au lieu de regarder toutes les lignes juste pour obtenir le plus gros ID d'insertion. Si votre table devient grande, cela pourrait devenir très inefficace.