2009-10-10 23 views
34

Diciamo che ho i seguenti dati nella tabella Clienti: (niente di più)SQL - Come trovare il numero più alto in una colonna?

ID FirstName LastName 
------------------------------- 
20 John  Mackenzie 
21 Ted   Green 
22 Marcy  Nate 

Che tipo di istruzione SELECT mi può ottenere il numero 22, nella colonna ID?

Ho bisogno di fare qualcosa di simile per generare un ID univoco. Certo, posso lasciare che il sistema lo faccia tramite l'auto-incremento, ma come posso ottenere l'ID generato automaticamente?

ho pensato di "SELECT id FROM Customers" e contare le righe restituite ma questo sembra orribilmente ineffecient e in questo caso, sarà in modo non corretto tornare "3", anche se ho bisogno di un ID univoco di 23.

+3

Nessuna mancanza di rispetto per msaeed, ma Brisbe42 & D le risposte avide di Andres sono migliori. –

+0

Ottimo punto, ma le loro risposte non rispondono direttamente alla mia domanda. Il mio metodo è comunque più sicuro da quando ottengo un ID gratuito e POI aggiungere un record. Ovviamente potresti dire che le operazioni simultanee potrebbero rovinare tutto questo da più programmi ottenendo lo stesso ID "libero" e riutilizzandolo ... ma questo può essere prevenuto aggiungendo un record super veloce dopo aver ottenuto un ID gratuito. –

+0

msaeed e alcuni altri analizzano la tua domanda * esattamente *. La domanda è "SQL - Come trovare il numero più alto in una colonna?" e "Che tipo di istruzione SELECT può ottenere il numero 22, nella colonna ID?".Correggi il tuo post per rendere più chiare le tue intenzioni. – Liao

risposta

78

È può fare

SELECT MAX(ID) FROM Customers; 
6
select max(id) from Customers 
8

per farlo in qualsiasi momento, si può fare SELECT MAX(Id) FROM Customers.

Nella procedura in cui viene aggiunto, tuttavia, è possibile utilizzare anche SCOPE_IDENTITY - per ottenere l'ultimo ID aggiunto da tale procedura.
Questo è più sicuro, perché ti garantirà il tuo Id - nel caso in cui altri vengano aggiunti al database contemporaneamente.

16

Se hai appena inserito un record nella tabella Clienti e hai bisogno del valore del campo ID recentemente popolato, puoi utilizzare la funzione SCOPE_IDENTITY. Ciò è utile solo quando l'INSERT si è verificato nello stesso ambito della chiamata a SCOPE_IDENTITY.

INSERT INTO Customers(ID, FirstName, LastName) 
Values 
(23, 'Bob', 'Smith') 

SET @mostRecentId = SCOPE_IDENTITY() 

Questo può o non può essere utile per voi, ma è una buona tecnica di cui essere consapevoli. Funzionerà anche con colonne generate automaticamente.

3

Se si utilizza l'uso AUTOINCREMENT:

SELEZIONE LAST_INSERT_ID();

assume di che si sta utilizzando Mysql: http://dev.mysql.com/doc/refman/5.0/en/example-auto-increment.html

Postgres gestisce questa similmente tramite la funzione currval (sequence_name).

Si noti che l'uso di MAX (ID) non è sicuro, a meno che non si blocchi il tavolo, poiché è possibile (in un caso semplificato) avere un altro inserto che si verifica prima di chiamare MAX (ID) e si perde l'id del primo inserto. Le funzioni di cui sopra sono basate sulla sessione, quindi se un'altra sessione ti inserisce ottieni ancora l'ID che hai inserito.

+0

L'uso dell'inserto con una sottoselezione rende il massimo (id) sicuro, vedi la mia risposta. Ma, in tutta onestà, l'autoincremento è una scelta migliore se è disponibile e non sei * troppo * preoccupato per la portabilità. – paxdiablo

+0

+1 per aver notato che MAX (ID) non è sicuro –

0

Dipende dall'implementazione SQL che si sta utilizzando. Ad esempio, MySQL e SQLite hanno modi per ottenere l'ultimo ID di inserimento. Infatti, se stai usando PHP, c'è anche una funzione elegante per esattamente quel mysql_insert_id().

Probabilmente dovresti cercare di utilizzare questa funzione MySQL invece di guardare tutte le righe solo per ottenere l'ID inserto più grande. Se il tuo tavolo diventa grande, potrebbe diventare molto inefficiente.

2

se non stai utilizzando i campi incremento automatico, è possibile ottenere un risultato simile con qualcosa come il seguente:

insert into Customers (ID, FirstName, LastName) 
    select max(ID)+1, 'Barack', 'Obama' from Customers; 

Questo farà sì non c'è alcuna possibilità di una condizione di competizione che potrebbe essere causato da qualcuno altrimenti inserendo nella tabella tra l'estrazione dell'ID massimo e l'inserimento del nuovo record.

Si sta utilizzando SQL standard, non ci sono dubbi sui modi migliori per raggiungerlo con DBMS specifico, ma non sono necessariamente portatili (qualcosa che prendiamo molto seriamente nel nostro negozio).

7

Se stai parlando MS SQL, ecco il modo più efficiente. Ciò recupera il seme di identità corrente da una tabella in base a qualsiasi colonna è l'identità.

select IDENT_CURRENT('TableName') as LastIdentity 

Utilizzando MAX(id) è più generico, ma per esempio ho una tabella con 400 milioni di righe che prende 2 minuti per ottenere il MAX(id). IDENT_CURRENT è quasi istantaneo ...

+1

Dovrò impegnare questo in memoria. Roba buona. –

+1

Davvero? Due minuti? Hai un indice su id? Dovrebbe essere quasi istantaneo per trovare min o max, anche con 400 milioni di righe. – paxdiablo

+0

È un indice non univoco, non in cluster sull'identità ... non è sicuro che sia la progettazione corretta per l'app, ma è quello che è. SQL 2005 Enterprise con uno schema di parzializzazione – Damon

-1
select * from tablename order by ID DESC 

che vi darà riga con id 22

+0

Ciò restituirà tutte le righe; con quello corretto nella "cima" del set di risultati. Non restituirà solo la riga con l'ID massimo. – Ben

6
SELECT * FROM Customers ORDER BY ID DESC LIMIT 1 

Poi ottenere l'ID.

2

È inoltre possibile utilizzare l'algebra relazionale. Una lunga procedura po ', ma qui si tratta solo di capire come funziona MAX():

E: = π ID (table_name)
E1: = π ID ID> = ID' ((ρ ID ' E) ⋈ E)) - π ID ID < ID' ((ρ ID' E) ⋈ E))

tua risposta: table_name ⋈ E1

Fondamentalmente quello che fai è insieme di sottrazione di relazione ordinata (a, b) in cui un < b da A dove a, b ∈ A.

Per i simboli relazione algebra vedere: Relational algebra From Wikipedia

+7

Non credo che le soluzioni di algebra relazionale saranno ben accolte per le domande SQL. –

0

In PHP:

$sql = mysql_query("select id from customers order by id desc"); 
$rs = mysql_fetch_array($sql); 
if (!$rs) { $newid = 1; } else { $newid = $rs[newid]+1; } 

così $newid = 23 se ultimo record nella colonna id era 22.

+0

Questa è una domanda su SQL. –

Problemi correlati