SQL Server 2005の環境では、テーブルの主キーは、どのように設計するかでなければなりません。
主キーのプログラムは現在、主に3種類の合計で使用されます。
- 自動主キーの成長
- マニュアルの主キーの成長
- UNIQUEIDENTIFIER主键
1、主キーの自動成長を開始し、それは、単純であるという利点を持ってサポートBIGINTの種類が、それは致命的な弱点があります。
我々は複数のデータベース間でのデータ複製する必要がある場合には、自動成長分野は、ときにデータの統合、主キーの競合を引き起こす可能性(SQL Serverのデータの分布を、サブスクリプション・メカニズムは、私たちはデータベース操作の間でデータをコピーすることができます)。自動的にそれを増やすべきではありません最後に、注文テーブル内の別のライブラリに受注をデータベース受注テーブルのコピーデータベースを想像してみ?
図2に示すように、再度手動で主キーを増やし、それは、主キー列とデータサンプルのデータ・タイプを制御することができる、独自の主キー列をカスタマイズするという利点を有する、安定鍵を標的得られるまず生成されたキーの繰り返し、それは費用が出ている維持されません値も実行している上ので、アカウントの同時実行の競合を考慮して、生産、大規模なネットワークのオーバーヘッドに独自のストアドプロシージャを記述する必要があります。
まず、およびint型:3は、最後にはGUIDキーとしてそれを使用する、あなたがそこにGUID、複製、統合データテーブルをすることが、2つの弱点を持っていない場合でも、直接NEWID()グローバルに一意の識別子を取得するために呼び出すことができ、UNIQUEIDENTIFIER主キーです比較、GUIDが不安定にして得られた4倍前者。第二に、NEWID(とGUID)の長さであり、主キーとしてカラムので、新しいデータを挿入するときに、非常に時間のかかる操作となり、クラスタ化インデックスが存在しなければなりません。この場合、主キーとしてUNIQUEIDENTIFIERが大きく効率を減少させるであろう。
次のSQL Server 2000のDBA環境だから。GUIDの前で時間が発生している時間関連のGUIDを生成するストアドプロシージャを記述するために主キーがグローバルユニークと時間増分のうちに生成されていることをこの性を保証する傾向がある。しかし、それは、第二に戻りました主キーのプログラム、不便なメンテナンスの一種。
図4は、SQL Server 2005のは)(NEWSEQUENTIALIDを使用してこの問題を解決しました
この機能によって生成されたGUIDは、その使用に次を見て増加しています
- 表実験作成 - UNIQUEIDENTIFIERを入力id列を作成します。1 - 2ROWGUIDCOL列のためだけのエイリアス、テーブルは一つだけ持つことができます - 3PRIMARY ID主キーKEYのOK - 自動的に列の4使用DEFAULT制約をGUIDを追加 作成 表ジョブズ ( ID UNIQUEIDENTIFIER ROWGUIDCOL PRIMARY KEY 、NOT NULL CONSTRAINT [ DF_jobs_id ] DEFAULT (NEWSEQUENTIALID())、 アカウントVARCHAR(64)未 ヌル、 パスワードVARCHAR(64)未 ヌル ) 外出先 を選択 * からの仕事 - 添加实验数据 挿入ジョブ(アカウント、パスワード)の値(' 土豆'、' 123 ' ) 、インサートジョブ(アカウント、パスワード)の値(' ntudou '、' 123 ' ) を挿入したジョブ(アカウント、パスワード)の値(' atudou '、' 123 ' ) 、インサートジョブ(アカウント、パスワード)の値("btudou ' ' 123 ' ) 、インサートジョブ(アカウント、パスワード)の値(' ctudou ' ' 123 " ) を選択 * からの仕事
結果:
- アイデンティティの使用は、我々は、新たにID @@ IDENTITYの選択によって追加に得ることができるということである - 使用UNIQUEIDENTIFIERどのようにそれを行うには? - 追加するIDを削除するNEWSEQUENTIALID()を選択し、手動成長方法を取るために - いいえ、構文がサポートされていません。 - 新しいデータid追加するには、次の方法で撮影することができます - としてADO.NETおよびSelect @@ IDENTITYでの使用 DECLARE @outputTable TABLE(ID UNIQUEIDENTIFIER ) INSERT INTO ジョブズ(アカウント、パスワード) OUTPUT INSERTED.ID にします @outputTable VALUES(' dtudou '、' 123 ' ) SELECT ID FROM @outputTable -データの比較 SELECT * からジョブズ
結果:
- ROWGUIDCOL列が主キーの別名で、直接、列名として使用することができます - ので、主キー列の名前を無視する INSERTジョブズ(アカウント、パスワード)の値(「etudou 」、「123 」) SELECT ROWGUIDCOL からジョブを
結果: