6

「テーブルごとにIDENTITY列は1つしか存在できません」

なんでそうなの?車両のシナリオを考えてみると、一意であることが判明した登録番号だけでなく、一意であるシャーシ番号が存在します。SQL Serverでこのシナリオを表現するには、onの列のカスタム実装が必要です。逆に、Oracleでは、テーブルに必要な数のシーケンスを含めることができます。IDENTITY列に制限があるのはなぜですか、特定の理由がありますか?

車両スキーマを持つシナリオは、ID列に制限がある理由について自分自身に疑問を投げかけているものです。

4

7 に答える 7

9

SQL ServerのID列には、シードと自動インクリメントがあります。とにかく最初のid列の値がわかっていれば、2番目の仮想id値がどうあるべきかをいつでも計算できます。

例:これが合法的な構文だった場合

create table #foo
(
bar int identity(1,10),
baz int identity(1000,1)
)

次のようにbarから計算できるため、bazを保存する必要はありません。

baz = 1000 + (bar-1)/10
于 2010-09-27T20:06:44.937 に答える
6

同じ値になるからです。プライマリとしてidentity(1,1)があり、identity(100,2)がある場合、次の結果が得られます。

1     100
2     102
3     104
4     106
5     108
6     110
7     112
8     114
9     116
10    118

これを行うことで2番目の列を取得できます。

((ID-1)* 2)+100

それは一次方程式なので、ショー以外のポイントは何でしょうか?

于 2010-09-27T20:08:11.483 に答える
2

データはデータベースに保存され、IDENTITY列によってキーが付けられます。このような単一の列により、ファイルシステムのようなストレージが可能になります。複数のIDENTITY列があると、問題が混乱します。

私の推奨事項は、列の1つをIDENTITYまたはに選択し、もう1つをに選択PRIMARY KEYすることUNIQUE KEYです。ユーザーとしては違いはありませんが、DBMSを満足させるでしょう。

于 2010-09-27T20:02:13.243 に答える
1
  • OracleシーケンスはSQLServerIDENTITY列ではありません。それらのコードを記述します。CREATETABLEDDLに基づいてそのままでは機能しません
  • 後続のIDENTITY列は、最初の列から作成できます(編集:他の人が言及したように)
于 2010-09-27T20:09:37.973 に答える
1

その理由は、私が見つけたMSDNでは説明されていません。ただし、SQLサーバーがID列を実装する方法に関係しているのではないかと思います。概念的には、これは列レベルよりもテーブルレベルでの設定または値であり、列は値にアクセスするための単なる方法だと思います。これは、ID値を操作するためのすべてのメソッドが、列ではなくテーブルをパラメーターとして持っているためだと思います。IDENT_SEED、IDENT_CURRENT、およびIDENT_INCR。列レベルの設定の場合、パラメーターには列名が含まれます。テーブルに複数のID列がある場合、それらの関数は機能しません。

ただ推測しているだけです。

于 2015-07-29T18:06:16.043 に答える
0

それは私が同意するばかげた制限です。ただし、回避するのはそれほど難しくありません。IDENTITY列を含む別のテーブルを作成するだけで、純粋にシーケンスジェネレーターとして使用できます。シーケンステーブルに挿入し、SCOPE_IDENTITY()を使用して値を取得してから、任意の場所に値を挿入します。その後、必要な数のシーケンスをサポートできます。

于 2010-09-29T19:18:00.650 に答える
0

代わりに、ある値とid値から始まる計算列を使用できます。

CREATE TABLE dbo.TwoIdentity (id INT IDENTITY (1,1) NOT NULL, SecondID AS 100+id, TEXT VARCHAR(50) NULL)

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

于 2021-10-18T21:00:33.173 に答える