6

ID 列の値を予約、スキップ、またはインクリメントする方法はありますか?

1 対 1 の関係で結合された 2 つのテーブルがあります。最初の列には IDENTITY PK 列があり、2 番目の列には int PK (IDENTITY ではない) があります。以前は最初に挿入し、ID を取得して 2 番目に挿入していました。そして、それは正常に動作します。

ここで、最初のテーブルに挿入せずに、2 番目のテーブルに値を挿入する必要があります。

次に、IDENTITY シードをインクリメントして、2 番目のテーブルに挿入できますが、最初のテーブルの ID に「穴」を残す方法を教えてください。

編集:詳細

これは機能します:

-- I need new seed number, but not table row 
-- so i will insert foo row, get id, and delete it
INSERT INTO TABLE1 (SomeRequiredField) VALUES ('foo'); 
SET @NewID = SCOPE_IDENTITY(); 
DELETE FROM TABLE1 WHERE ID=@NewID;

-- Then I can insert in TABLE2  
INSERT INTO (ID, Field, Field) VALUES (@NewID, 'Value', 'Value'); 

もう一度-これは機能します。

質問は、テーブルに挿入せずに ID を取得できますか?

DBCC には所有者権限が必要です。それを行うためのクリーンなユーザー呼び出し可能なSQLはありますか?

4

7 に答える 7

6

この状況では、全体的なデータ構造が非常に理解しにくくなります。値の間に関係がない場合は、関係を壊します。

これを回避して探していることを実行する方法はありますが、通常は分散環境にあり、データ モデルの変更のように見えるため実行されません。

于 2009-01-26T16:16:25.080 に答える
4

その後、1対1の関係ではなくなります。

PK 制約を破るだけです。

于 2009-01-26T16:14:44.880 に答える
3

SQL Server Books Online のこの記事では、DBCC CHECKIDENT メソッドを使用してテーブルの ID シードを更新する方法について説明しています。

その記事から:

この例では、jobs テーブルの現在の ID 値を強制的に 30 にします。

USE pubs
GO
DBCC CHECKIDENT (jobs, RESEED, 30)
GO
于 2009-01-26T16:24:38.277 に答える
3

DBCC CHECKIDENTステートメントを使用します。

于 2009-01-26T16:14:08.330 に答える
0

OUTPUT INTOSQL Server 2005以降を使用している場合は、この機能を調べます。これにより、プライマリテーブルに挿入し、その時点で割り当てられたIDを使用してセカンダリテーブルに行を作成できます。

そもそもこれを行う必要がある唯一の理由はそれであるため、外部キー制約が適用されていると想定しています。

于 2009-01-26T17:41:17.700 に答える
0

後でそれらをどのように一致させる予定ですか? 最初のテーブルにレコードがなければ、2番目のテーブルにレコードを入れません。そのため、そのようなアクションを設定するために、外部キー関係で設定されています。とにかく最初のテーブルにレコードを挿入したくないのはなぜですか? アプリケーションの種類と、これが必要な理由について詳しく知っていれば、解決策をご案内できるかもしれません。

于 2009-01-26T18:14:44.483 に答える
0

これは役立つかもしれません

SET IDENTITY_INSERT [ データベース名 . [スキーマ名] . ] テーブル { オン | オフ }

http://msdn.microsoft.com/en-us/library/aa259221(SQL.80).aspx

テーブルの ID 列に明示的な値を挿入できます。

于 2009-01-26T18:58:15.190 に答える