2009-03-07 8 views

Odpowiedz

16

To zależy od serwera bazy danych. Używając MySQL, zadzwoń pod numer mysql_insert_id() natychmiast po zapytaniu o wstawienie. Przy użyciu PostgreSQL, pierwsze zapytanie "select nextval(seq)" w sekwencji i dołączyć klucz do zapytania wstawiania.

Zapytanie o "select max(id) + 1 from tbl" może się nie powieść, jeśli inne żądanie wstawi rekord jednocześnie.

0

w PHP: mysql_insert_id() http://us3.php.net/mysql_insert_id

lub

Jeśli chciał genterate numer z mySql kwerendę wybierającą, można użyć tego EDIT:

SELECT LAST_INSERT_ID(`1`) + 1 FROM table 
+0

Wybranie maksimum może być problemem, jeśli wiele procesów nie obsługuje wstawiania wstawek? – schooner

+1

jeśli wstawisz rekord, a następnie usuniesz rekord, a następnie uruchomisz to zapytanie, otrzymasz tożsamość usuniętego rekordu. kolejna wstawka nie dostanie tej tożsamości w żadnej implementacji, o której mi wiadomo. Unikaj tego za wszelką cenę ... – MatBailie

+0

powinieneś umieścić blokadę odczytu na stole, jeśli chcesz, aby było to bezpieczne! nawet wtedy nie jestem pewien, czy DBMS nie użyje ponownie niektórych usuniętych identyfikatorów, jeśli gdzieś istnieje luka w tabeli. –

3

To zależy od używanego silnika bazy danych. Niektóre DBMS, na przykład Firebird, mają klauzulę RETURNING, którą możesz dodać do zapytania. Na przykład, jeśli masz tabelę o nazwie Tabela1 z kolumny autoincrement nazwie ID, można użyć to:

insert into TABLE1(columns...) values (values...) returning ID; 

I byłoby powrócić wstawiony identyfikator jak zwykły SELECT.

0

Bądź bardzo ostrożny: Najwyraźniej wybierz nextval (seq) nie działa w wysokiej współbieżności - niektóre inne połączenia mogą wstawiać między czasem wstawienia i czasem, w którym wywołałeś select nextval (seq). Zawsze testuj taki kod w wiązkach testowych o wysokiej współbieżności.

+0

Nie ma to znaczenia, chyba że używasz identyfikatora do zamawiania, ponieważ używasz wyniku z nextval (seq), a nie innego wywołania samej sekwencji. –

2

W Microsoft Transact SQL można użyć @@ IDENTITY.

np.

DECLARE @Table TABLE (col0 INT IDENTITY, col1 VARCHAR(255), col2 VARCHAR(255)) 

INSERT INTO @Table (col1, col2) VALUES ('Hello','World!') 

SELECT @@Identity 

SELECT * FROM @Table 
+1

Nigdy nie używaj tożsamości @@, to nie zawsze da ci prawidłową wartość tożsamości i może spowodować bardzo złe problemy z integralnością danych. Użyj scope_identity() – HLGEM

+0

Cóż, tożsamość @@ jest w porządku, o ile wiesz, co robi i jaki jest zakres jego działania. Po prostu zachowaj ostrożność, jeśli masz wyzwalacze na tabelach (wstawienie do tabeli z kolumną tożsamości w wyzwalaczu spowoduje aktualizację tożsamości @@) lub jeśli tabela zostanie zreplikowana. Ok, prawdopodobnie bezpieczniej jest użyć scope_identity() :) – Jon

0

W SQL Server wkładka pomocą select może mieć klauzulę wyjściowy, który zwróci wartość tożsamości i wszelkie inne kolumny mogą być potrzebne do identyfikacji tożsamości, która idzie do którego rekord. Jeśli używasz klauzuli value, użyj select scope_identity() zaraz po wstawieniu.

7

W PostgreSQL najlepszym sposobem jest zrobić coś takiego:

insert into foos(name) values ('my_foo') returning id;