SQL - Comment trouver le plus grand nombre dans une colonne?
Permet de dire que j'ai les données suivantes dans la table Clients: (rien de plus)
ID FirstName LastName
-------------------------------
20 John Mackenzie
21 Ted Green
22 Marcy Nate
Ce genre d'instruction SELECT peut me procurer le numéro 22, dans la colonne ID?
J'ai besoin de faire quelque chose de ce genre pour générer un IDENTIFIANT unique. Sûr que je peux laisser le système faire via l'auto-incrémentation, mais comment aurais-je obtenir la génération automatique d'ID?
J'ai pensé à "SELECT ID from Clients" et en comptant le nombre de lignes retournées, mais cela semble horriblement ineffecient et dans ce cas, il renvoie incorrectement "3", si j'ai besoin d'un ID unique de 23.
- Grand stade, mais leurs réponses ne sont pas directement répondu à ma question. Ma méthode est la plus sûre de toute façon puisque je obtenir gratuitement un IDENTIFIANT, PUIS ajouter un enregistrement. Bien sûr, vous pourriez dire les opérations simultanées pourrait mess cette place par plusieurs programmes en obtenant le même "libre" de l'ID et de le réutiliser ... mais cela peut être évité par l'ajout d'un enregistrement ultra-rapide après l'obtention d'un IDENTIFIANT libre.
- msaeed et quelques autres réponse à votre question exactement. La Question étant "SQL - Comment trouver le plus grand nombre dans une colonne?" et "Quelle sorte d'instruction SELECT peut me procurer le numéro 22, dans la colonne ID?". Corriger votre message pour le rendre plus clair sur vos intentions.
- Nope. Je n'étais même pas parler de ces réponses, seulement ceux rexem souligné. Les autres réponses de parler de l'insertion de l'obtention de l'ID, qui n'est clairement pas ce que j'ai demandé. J'ai demandé de l'22 (nombre maximum), pas 23 (récemment peuplé ID).
- Non, comme Brisbe42 expliqué votre méthode n'est pas sûre, car la base de données niveau d'isolation peuvent être définies pour permettre la lecture des données avant INSERTION/mise à JOUR s'engage. Si vous rencontrez des erreurs relatives à tenter d'insérer un non-clé primaire unique, j'espère que vous vous souvenez de cette question.
- Bien obligé pour les pouces vers le haut. Merci.
- Si cela peut nuire à la performance, vous pouvez envisager de transactions explicites si vous êtes préoccupé par la simultanéité et la duplication de l'IDs.
- veuillez être prudent de reconnaître que la plus haute ID dans une table n'est pas nécessaire de les plus récemment entrés ou même une garantie que la prochaine ID plus après ce n'est pas déjà pris.
- vous serait sage de ne pas dépendre de votre "super rapide" de la méthode. Les programmes devraient être déterministe dans la nature autrement ils sont sensiblement incorrect. Ce que vous avez à faire est de jeter l'Un de vos ACIDE principes. Si vous exécutez une seule base de données utilisateur de l'app, c'est bien. Tous les autres cas doivent utiliser des opérations atomiques.
- pourriez-vous expliquer "comment aurais-je obtenir la génération automatique d'une pièce d'identité?" Vous n'auriez pas besoin de cela si vous êtes juste de l'insertion d'un nouvel enregistrement à la table de générer le prochain ID pour vous.
- Pour la même question, comment ai-je pu également récupérer les valeurs correspondantes pour les deux autres colonnes, j'.e, FirstName=Marcy et LastName=Nate?
Vous devez vous connecter pour publier un commentaire.
Vous pouvez faire
Si vous avez inséré un enregistrement dans la table Clients et vous avez besoin de la valeur de la récemment peuplé champ ID, vous pouvez utiliser le SCOPE_IDENTITY fonction. Ce n'est utile que lors de l'INSERTION a eu lieu au sein de la même portée que l'appel à SCOPE_IDENTITY.
Cela peut ou peut ne pas être utile pour vous, mais c'est une bonne technique pour être au courant de. Il travaillera également avec auto-généré colonnes.
Puis obtenir l'ID.
Pour l'obtenir, à tout moment, vous pouvez faire
SELECT MAX(Id) FROM Customers
.De la procédure que vous l'ajouter, cependant, vous pouvez également faire usage de
SCOPE_IDENTITY
-- pour obtenir l'id de la dernière ajoutées par cette procédure.C'est plus sûr, car il permettra de garantir que vous obtenez votre
Id
... juste au cas où d'autres sont ajoutés à la base de données en même temps.Si vous parlez MS SQL, voici le moyen le plus efficace. Cet extrait d'identité en cours de semences à partir d'une table en fonction de ce que la colonne est l'identité.
À l'aide de
MAX(id)
est plus générique, mais par exemple j'ai une table avec plus de 400 millions de lignes qui prend 2 minutes pour obtenir leMAX(id)
.IDENT_CURRENT
est quasi instantanée...Si vous utilisez
AUTOINCREMENT
, utilisation:Assumming que vous utilisez Mysql:
http://dev.mysql.com/doc/refman/5.0/en/example-auto-increment.html
Postgres gère de la même manière via le
currval(sequence_name)
fonction.Notez que l'utilisation de
MAX(ID)
n'est pas sûr, à moins que vous verrouillez la table, puisqu'il est possible (dans un cas simplifié) d'avoir un autre insert qui se produit avant que vous appelezMAX(ID)
et vous perdez l'id de la première insertion. Les fonctions ci-dessus sont de session, donc si une autre session insère vous obtenez toujours l'ID que vous avez inséré.Si vous n'utilisez pas l'auto-incrémentation des champs, vous pouvez obtenir un résultat similaire avec quelque chose comme ce qui suit:
Ce sera d'assurer qu'il n'y a aucune chance d'une condition de concurrence qui pourrait être causé par quelqu'un d'autre de l'insertion dans la table entre votre extraction du maximum de l'ID et votre insertion d'un nouvel album.
C'est à l'aide de la norme SQL, il y a sans doute de meilleures façons de réaliser cela avec SGBD spécifique", mais ils ne sont pas nécessairement portable (quelque chose que nous prenons très au sérieux dans notre boutique).
Vous pouvez également utiliser l'algèbre relationnelle. Un peu longue procédure, mais ici c'est juste pour comprendre comment MAX() fonctionne:
E := πID (Nom_table)
E1 := πID (σID >= ID' ((ρID' E) ⋈ E)) – πID (σID < ID’ ((ρID' E) ⋈ E))
Votre réponse:
Table_Name ⋈ E1
Fondamentalement, ce que vous faire est de soustraire ensemble de commandé la relation(a,b) dans lequel un
<
b à partir de A, où a, b ∈ A.Pour relation algèbre des symboles voir:
L'algèbre relationnelle
À Partir De Wikipedia
Dépend de ce que l'implémentation SQL que vous utilisez. Les deux bases de données MySQL et SQLite, par exemple, ont les moyens d'obtenir le dernier id inséré. En fait, si vous êtes à l'aide de PHP, il y a même une chouette fonction pour exactement ce que mysql_insert_id().
Vous devriez probablement regarder pour utiliser cette fonction MySQL au lieu de regarder toutes les lignes, juste pour obtenir le plus grand insert ID. Si votre table devient grand, qui pourrait devenir très inefficace.
Si vous voulez il suffit de sélectionner le
id
utilisationselect max(id) from customer
.Si vous voulez choisir l'ensemble de la ligne, puis utiliser une requête comme ceci:
c2
est un alias de la nouvelle table temporaire qui contientmax id
. Puis sa croix produit est pris avec le client de la table pour obtenir la totalité de la ligne.Ici nous sommes à l'écriture d'une requête dans la clause from, qui peuvent souvent être très utile.
qui vous donnera ligne avec l'id 22
En PHP:
ainsi
$newid = 23
si le dernier enregistrement dans la colonne id de 22.