-2

ID, Name, DesignationIDが主キーで、その ID 仕様が有効で、1 でシードされている3 つの列を持つテーブルがあります。

テーブルに 10 行あるとします。In a sequence 列の値は順番に並んでIDいます

1,2,3......10. 

ユーザーが10行目を削除してから新しい行を挿入すると、ID列の値として11が挿入されます。最後の行の値をインクリメントするにはどうすればよいですか? IDつまり、列の値が9になる前に、新しい行の値として「10」が必要です。

MAXSQL Serverの機能を使いたくない、自動インクリメントしたい。これを達成する方法はありますか?

PS: DB に値を挿入するためにエンティティ フレームワークを使用しています。

4

4 に答える 4

1

危険なライブが好きな人にとっては可能ですが、ID 列を再シードすることはお勧めできません。

TSQL は

dbcc checkident ([tableName], reseed, [previousHighestID])

次の表を考えます。

create table x ( a int identity(1,1), y varchar(max) )

エンティティ フレームワーク:

using (var context = new XContext())
{
    context.Database.SqlCommand("insert into x select 'abc'");//id 1
    context.Database.SqlCommand("insert into x select 'cba'");//id 2
    context.Database.SqlCommand("delete from x where a = 2");//delete id 2
    context.Database.SqlCommand("declare @identMax int; select @identMax = max(a) from x; dbcc checkident (x, reseed, @identMax)");
    //reseed identity to 1 ( so next insert will be id 2 )
    context.Database.SqlCommand("insert into x select 'def'");//id 2 (again!)
    var X = context.X.SqlQuery("select * from x").ToList();    
}

いくつかの欠損値については本当に心配する必要はありません。int または bigint 列は、多くの値を表すことができます。

ジャック・ハンディの深い考えを思い出しました:

「鍵を溶岩の中に落としたら放っておけばいいんだよ、鍵はなくなってしまったから」

于 2013-10-12T10:44:44.883 に答える
0

ID/自動インクリメント フィールドをリサイクルする必要があるのは、そのフィールドの値がほぼ枯渇しているか、値が大幅に断片化されている場合のみです。

于 2013-10-12T14:22:57.747 に答える
0

手動で行うことができます。

ステップ 1 : 主キーの IsIdentity="ON" を削除します (または、IsIdentity を OFF に設定します)。

ステップ 2: EF クエリを使用してテーブルの最後の行を取得し、データベースにデータを保存するたびに主キー列の値を取得します。(単一のクエリで、エンティティのリストにある最新の関連エンティティ レコードを読み込みます)

ステップ 3: 最後の行の主キー値が 9 の場合、その値に +1 を追加し、主キー列の値が 10 の新しい値を格納できます。

于 2013-10-12T09:46:41.580 に答える
-1

あなたがそれを行うことができないID列を持っている場合、あなたがしたい挿入は一度だけのことです..それからあなたは試すことができます:

SET IDENTITY_INSERT XXX ON
GO

-- INSERT WITH THE IDENTITY VALUE YOU WANT

SET IDENTITY_INSERT XXX OFF
GO
于 2013-10-12T08:39:49.427 に答える