SQLサーバーの複合キー体験
-
25-09-2019 - |
質問
したいのですが、複合キーにもそういものをご提案)、文書の表に示す。この二つの柱年(2010年)およびID、autoincrementingもので再起動そのもの。
そのキーのようにこれらの2010-1, 2010-2, ..., 2011-1, 2011-2, ...とpreferrablyそのキーを使用することも示、印刷とを示すことが知られています。
がなくなるとは思えなautoincrementingまでのリセット、毎年ねという単位ですが、自分の獲得になってきます。
は私varcharカラムを構築、各自の投入するだけで、簡単なるカラム?
では、どうして私のオプション?
くださいを考慮した将来設計の問題について、設計やレイアウト設計、設備設計もされていると容易に照会.
更新:
私はじめへの応用構築の鍵を提供することが挿入の場合.ただし、必要としまDBのIDを発行し、この問題に高ます。
解決
でも業務データの保管構造です。なぜですか?明日からか判断できるビジネスロジック:
- 非整数を文書順序(1-AA1-AB-1-AC"など...)
- などの年月をか月次報告書
- その他は変わります---
とに何をすべきだよ?
なので、私の解決には:
- 使用主キー(int、例えばやお好みのデータタイプ)な関係その他のデータベース上のテーブル
- 利用ビジネスキー1.2.3として---いつも一部の識別子を発生させる装置)
- 利用したdatetimeの分野に店日の追加ドキュメントでは、年換算できます。
他のヒント
なぜ、実際の自動インクリメントIDを追加していませんか?複合キーはすぐに彼らは事実上無用だところに成長することができます - 特に、パフォーマンス上の理由から、あなたはテーブルの上に参加する必要があります。あなたは、その後、文書XYZは、2010年に保存された最初の文書であったことをログに記録したい場合、あなたはまだYear
とOrder
(または何でも)の列を持っていますが、きれいあなたの主キー滞在ができます。
あなたは自動インクリメントのキーを作成する手間するつもりなら、私は毎年の上にそれをリセットするという考えを捨て、とだけではなく、IDENTITY INT列を使用することになります。
あなたは一年以内に、文書のシーケンス番号を取得したい場合は、あなたがそれを行うために使用できるSQL機能があります:
ROW_NUMBER()OVER(PARTITION BY ... ORDER BY ...)
私は信じていませんが、自動インクリメント私は単位を自分で作成する必要がありますねので、私ではないでしょう、なぜならリセット毎年、意志の仕事を?
うん。
Iがリセット値を生成するために列を追加推薦します。 IDENTITYカラムには、最高のだろう。 DATETIMEは、レコードの作成時間を保持することができますが、互いの3.33ミリ秒(0 00333秒)内のトランザクションが同じタイムスタンプを持っているでしょう。
いずれかの方法は、使用してid
値を生成することができます:
SELECT (SELECT COUNT(*)
FROM DOCUMENTS t
WHERE t.year = d.year
AND t.col <= d.col) AS id,
d.year
FROM DOCUMENTS d
それとも、SQL Serverの2005+にしている場合は、あなたが使用することができます:
SELECT ROW_NUMBER() OVER (PARTITION BY d.year ORDER BY d.col) AS id,
d.year
FROM DOCUMENTS d