-1

ABCという名前のテーブルを作成しました。次の3つの列があります。-

ここに画像の説明を入力してください

この列number_pk (int)は、その列の機能を作成したテーブルの主キーです。auto increment

今、私はそのテーブルから2つの行を削除Number_pk= 5Number_pk =6ました。

私が今得ているテーブルはこのようなものです:-

ここに画像の説明を入力してください

ここで、同じ値でこのテーブルに2つの新しい行を再度入力すると、2つの新しい行が取得されますNumber_pk starting from 7 and 8

ここに画像の説明を入力してください

私の質問は、テーブルから2つの行を削除したので、この背後にあるロジックは何であるかということです。簡単な答えは、テーブルの主キーの自動インクリメントをオンに設定したためです。しかし、テーブルのデザインを変更せずに、最後のNumber_pkから始まる2つの新しいエントリを挿入できる方法はありますか?

また、データベースから行を削除してから、SQL Serverはこのレコードをどのように管理しますか?

4

2 に答える 2

0

ただし、特定の要件になるまでこれを行うべきではありません。

1.) 最大 ID を取得します。

Declare @id int
Select @id = Max(Number_pk) From ABC
SET @id = @id + 1;

2.) ID 列をリセットします。

DBCC CHECKIDENT('ABC', RESEED, @id)

DBCC CHECKIDENT (Transact-SQL)

于 2012-11-07T16:56:32.283 に答える
0

ロジックは、生成された数値が一意であることを保証しています。ID フィールドは必ずしも意味を持つ必要はありませんが、一意のレコードを識別するために最も頻繁に使用されるため、操作が簡単になります。

データベースが適切に設計されていれば、削除された ID 番号が外部キー関係にある他のテーブルによって参照されていた場合、削除できなかったため、レコードがそのように孤立するのを防ぐことができます。

エントリ シーケンスが絶対に必要な場合は、 を発行することを検討できますRESEEDが、提案されているように、実際にはあまり利点がありません。

ID レコードは "管理" されます。これは、SQL Server が発行された番号がまだ存在するかどうかに関係なく追跡するためです。

テーブルからすべてのレコードを削除したい場合は、次の 2 つの方法があります (外部キー関係が存在しない場合)。

DELETE FROM Table

DELETEレコードを削除するだけですが、次の INSERTED 値は ID 番号が残っているところから継続します。

TRUNCATE TABLE

TRUNCATE実際にテーブルを RESEED するため、最初に指定した値 (ほとんどの場合 1) から再開することが保証されます。

于 2012-11-07T16:58:21.890 に答える