2012-04-14 15 views
1

テーブルのプライマリキーを生成するときの最適な方法は何ですか?プライマリキー生成のアプローチ

つまり、データベースによって受信されたデータが注入型ではなく、主キーとして使用できない場合。

コードでは、テーブル行の主キーを管理する最も良い方法は何ですか?

ありがとうございました。 MySQLで

+0

すみませんが、私は「注射」を理解していません。どういう意味ですか? – Steve

+0

'注入関数は、鮮明度を保存する関数です' – nothrow

答えて

2

まず勧告は、主キーのために離れてUNIQUEIDENTIFIERからご利用いただけます。それはクライアント側を生成するいくつかの興味深い簡単な方法がありますが、プライマリキー上の任意のidexesを持つことは有用である可能性がほとんどありません。私が時間内に戻って、使用された場所の99%からユニークアイデンティファイアを禁止することができれば、これは過去2年間に3人年のdba /開発時間を節約できました。

INT IDENTITYを主キーとして使用することをお勧めします。

create table YourTableName(
    pkID int not null identity primary key, 
    ... the rest of the columns declared next. 
) 

ここで、pkIDは主キー列の名前です。

これはあなたが探していることを行うはずです。

+0

面白いです。あなたはあなたの推薦を広げて、ユニークな識別子を持つあなたの執事がどうして悪いのかを説明できますか?なぜ有用なインデックスがないのですか?それは型サイズとインデックスサイズのためですか? – huhu78

+0

インデックスにuniqueidentifierがあると、自然な並べ替え順序がないため、非常に非効率的です。索引のbツリー構造に基づいて、uniqueidentifierを使用するときわめて断片化された索引が作成されます。再構築または再編成後、それらは依然として非常に細分化されています。だから、インデックスが遅くなり、断片化のためにメモリとディスクに膨大になります。また、uniqueidentifierの挿入時には、インデックス上のページ分割によって結局挿入が遅くなる可能性が高くなります。一般的に、uniqueidentifierはインデックスの悪いニュースです。 –

+0

良い点。覚えておきます。私は、プライマリキーとしてuniqueidentifierを持ち、ユニークではないがuniqueidentifierカラムの前にデータカラムをソートするというCLUSTEREDインデックスを構築することが妥協であると思います。次に、テーブル/ページに「物理的」かつ有用なデータの順序があります。 – huhu78

2

AUTO_INCREMENT、SQL Server内のIDENTITY .. SQL Server内の

1

IDENTITY

、あなたが取得する必要がある場合INSERTがデータを-ingながら、新しいIDが何であったかを知っているINSERT声明のOUTPUT句を使用します - 新しい行のコピーがテーブル型のparamに置かれます。

SQLでユニークなIDを生成するのがあなたには適していない場合は、アプリケーションでGUIDを生成してください - GUIDは単調性が非常に高いレベルです(実際には保証されていません)。そして、SQL Serverには列の専用のGUIDタイプがあります - uniqueidentifierと呼ばれています。

http://msdn.microsoft.com/en-us/library/ms187942.aspx

関連する問題