Customersテーブルに次のデータがあるとしましょう:(これ以上)
ID FirstName LastName
-------------------------------
20 John Mackenzie
21 Ted Green
22 Marcy Nate
ID列で、どのようなSELECTステートメントで番号22を取得できますか?
一意のIDを生成するには、このようなことをする必要があります。システムに自動インクリメントでこれを実行させることはできますが、自動生成されたIDを取得するにはどうすればよいですか?
「SELECT ID FROM Customers」を考えて、返された行をカウントしましたが、これはひどく非効率的で、この場合、23という一意のIDが必要ですが、誤って「3」を返します。
できるよ
SELECT MAX(ID) FROM Customers;
Customersテーブルにレコードを挿入したばかりで、最近入力されたIDフィールドの値が必要な場合は、SCOPE_IDENTITY関数を使用できます。これは、SCOPE_IDENTITYの呼び出しと同じスコープ内でINSERTが発生した場合にのみ役立ちます。
INSERT INTO Customers(ID, FirstName, LastName)
Values
(23, 'Bob', 'Smith')
SET @mostRecentId = SCOPE_IDENTITY()
これはあなたにとって役に立つかもしれないし、そうでないかもしれませんが、知っておくと良いテクニックです。また、自動生成された列でも機能します。
SELECT * FROM Customers ORDER BY ID DESC LIMIT 1
次に、IDを取得します。
select max(id) from customers
いつでも取得するには、SELECT MAX(Id) FROM Customers
を実行できます。
ただし、追加するプロシージャでは、SCOPE_IDENTITY
-を使用して、そのプロシージャによって最後に追加されたIDを取得することもできます。
これは、Id
を取得することを保証するため、安全です。他のデータベースが同時にデータベースに追加される場合に備えて。
MS SQLを使用している場合、ここが最も効率的な方法です。これにより、IDである列に基づいてテーブルから現在のIDシードが取得されます。
_select IDENT_CURRENT('TableName') as LastIdentity
_
MAX(id)
の使用はより一般的ですが、たとえば、MAX(id)
を取得するのに2分かかる4億行のテーブルがあります。 _IDENT_CURRENT
_はほぼ瞬時に...
select max(id) from Customers
AUTOINCREMENT
を使用している場合は、次を使用します。
SELECT LAST\_INSERT\_ID();
Mysqlを使用していると仮定すると: http://dev.mysql.com/doc/refman/5.0/en/example-auto-increment.html
Postgresはcurrval(sequence_name)
関数を介してこれを同様に処理します。
テーブルをロックしない限り、MAX(ID)
を使用しても安全ではないことに注意してください。MAX(ID)
を呼び出して、最初の挿入。上記の関数はセッションベースであるため、別のセッションが挿入されても、挿入したIDを取得できます。
リレーショナル代数を使用することもできます。少し長い手順ですが、ここではMAX()がどのように機能するかを理解するだけです。
E:=πID (テーブル名)
E1:=πID (σID> = ID ' ((ρID ' E)⋈E))–πID (σID <ID ’ ((ρID ' E)⋈E))
あなたの答え:Table_Name⋈E1
基本的にあなたがすることは、a、b∈AであるAからa<
bである順序付き関係(a、b)のセットを引くことです。
関係代数記号については、以下を参照してください。 Wikipediaからの関係代数
自動インクリメントフィールドを使用していない場合、次のようなもので同様の結果を達成できます。
insert into Customers (ID, FirstName, LastName)
select max(ID)+1, 'Barack', 'Obama' from Customers;
これにより、最大IDの抽出と新しいレコードの挿入の間に他の誰かがテーブルに挿入することによって競合状態が発生する可能性がなくなります。
これは標準SQLを使用しているため、特定のDBMSでそれを実現するより良い方法があることは間違いありませんが、それらは必ずしも移植性があるとは限りません(私たちの店では非常に真剣に考えています)。
id
のみを選択する場合は、select max(id) from customer
を使用します。
行全体を選択する場合は、次のようなクエリを使用します。
select c1.*
from customer c1, (select max(id) as max_id from customer )c2
where c1.id=c2.max_id
c2
は、max id
を含む新しい一時テーブルのエイリアスです。次に、そのクロス積をcustomerテーブルで取得して、行全体を取得します。
ここでは、from句でクエリを記述しています。これは非常に便利です。
使用しているSQL実装に依存します。たとえば、MySQLとSQLiteの両方に、最後の挿入IDを取得する方法があります。実際、PHPを使用している場合は、そのmysql_insert_id()のための気の利いた関数さえあります。
最大の挿入IDを取得するためだけにすべての行を調べるのではなく、このMySQL機能を使用することをお勧めします。テーブルが大きくなると、非常に非効率になる可能性があります。