2

INDEX作成ステートメントにUNIQUE引数があるのはなぜですか?

私が理解しているように、非クラスター化インデックスにはブックマーク、行へのポインターが含まれています。これは、非一意の行を区別するために一意である必要がある
ため、非クラスター化インデックスが一意であることを保証しますか?
正しい?

では、一意でないインデックスはクラスター化されたテーブルにのみ存在できることを理解していますか?以来

  • 「ビューのクラスター化されたインデックスは一意である必要があります」[1]

「クラスター化インデックスの最下位またはリーフレベルには、テーブルの実際のデータ行が含まれている」[1]ので、クラスター化インデックスに対するUNIUEと同じ効果が、(おそらくすべてまたはの一部)テーブルの列[2]?

それでは、インデックスにUNIQUE引数をもたらすものは何ですか?
基本的な概念の定義との混同を除いて[3]


更新:
これも同じ落とし穴です-未定義の用語に基づいてすでに何度も説明されていることを説明し、すべての説明を終わりのない推測ゲームに変換します。
私のサブ質問[4]を参照してください。これは、この同じ質問を実際に言い換えたものです。


Update2:
問題はあいまいで、定義が不足しているか、不適切なコンテキストでの用語の不適切な使用にあります。インデックスが実際のデータを(検索して)識別/ポイントする構造として定義されている場合、一意でないインデックスまたはNULLインデックスは意味がありません。さよなら


引用:
[1]
CREATE INDEX(Transact-SQL)
http://msdn.microsoft.com/en-us/library/ms188783.aspx

[2]
CREATE TABLE(Transact-SQL) http://msdn.microsoft.com/en-us/library/ms174979.aspx

[3]
一意のインデックスまたは一意のキー?
一意のインデックスまたは一意のキー?

[4]
インデックスとは何ですか?非クラスター化インデックスは非一意である可能性がありますか?
インデックスとは何ですか?非クラスター化インデックスは非一意である可能性がありますか?

4

4 に答える 4

6

(あなたが言ったように)行を区別するには一意でないインデックスで十分ですが、UNIQUEインデックスは制約として機能します。データベースに重複が入力されるのを防ぎます。「重複」とは、インデックス付きの列に同じデータを含む行です。 。

例:

 Firstname  | Lastname  | Login
================================
 Joe        | Smith     | joes
 Joe        | Taylor    | joet
 Susan      | Smith     | susans

ログイン名は、デフォルトで名+姓の最初の文字から生成されると仮定します。

Joe Sciavilloをデータベースに追加しようとするとどうなりますか?通常、システムはloginnamejoesを生成し、を挿入し(Joe,Sciavillo,joes)ます。これで、同じユーザー名を持つ2人のユーザーがいることになります。おそらく悪いことです。

ここで、列にUNIQUEインデックスがあるLoginとします。データベースは、新しい行の挿入を許可する前に、同じデータを持つ他の行がすでに存在しないことを確認します。つまり、別のデータを挿入しようとするとjoes、そのデータはその行で一意ではなくなるため、拒否されます。

もちろん、複数の列に一意のインデックスを設定することもできます。その場合、データの組み合わせは一意である必要があります(たとえば、の一意のインデックスは、組み合わせがまだテーブルにないためFirstname,Lastname、の行を受け入れますが、拒否します)(Joe,Badzhanov)の2行目(Joe,Smith)

于 2010-09-26T18:04:29.003 に答える
2

UNIQUEインデックス句は、実際にはSQLServerやその他のDBMSの構文の癖にすぎません。標準SQLでは、一意性制約は、インデックスではなく、PRIMARYKEYおよびUNIQUECONSTRAINT構文を使用して実装されます(標準SQLにはインデックスがありません)。

SQL Serverが一意性制約を実装するために内部的に使用するメカニズムは、一意のインデックスと呼ばれます。PRIMARY KEYまたはUNIQUE制約を作成するたびに、一意のインデックスが自動的に作成されます。SQL Server開発チームに最もよく知られている理由により、制約構文が同じ役割を果たしている場合でも、CREATEINDEX構文の一部としてUNIQUEキーワードを公開することにしました。

明確さと標準のサポートのために、可能な限りUNIQUEインデックスを明示的に作成しないことをお勧めします。代わりに、PRIMARYKEYまたはUNQIUE制約構文を使用してください。

于 2010-09-29T19:52:31.300 に答える
0

UNIQUE句は、列の値がテーブル全体で一意である必要があることを指定し、基本的に一意の制約を追加します。テーブルのクラスター化インデックスは、テーブル内の行の順序がインデックスと同じになることを指定します。非クラスター化インデックスは物理的な順序を変更しません。そのため、複数の非クラスター化インデックスを使用しても問題ありませんが、クラスター化インデックスは1つだけです。テーブルには、一意または非一意のクラスター化インデックスと非クラスター化インデックスを含めることができます。

于 2010-09-26T18:06:39.670 に答える
0

根本的な質問は、一意のインデックスと一意でないインデックスの違いは何ですか?

答えは、一意のインデックスのエントリはそれぞれ1つの行のみを指すことができますが、一意でないインデックスのエントリは多くの行を指すことができるということです。

たとえば、注文アイテムテーブルについて考えてみます。

ORDER_NO     INTEGER
LINE_NO      INTEGER
PRODUCT_NO   INTEGER
QUANTITY     DECIMAL

-ORDER_NOとLINE_NOに一意のインデックスがあり、PRODUCT_NOに一意でないインデックスがあります。

ORDER_NOとLINE_NOの単一の組み合わせの場合、テーブルには1つのエントリしかありませんが、PRODUCT_NOの単一の値の場合、テーブルには多くのエントリがあります(インデックスにはその値のエントリが多数あるため)。

于 2010-09-27T12:29:11.840 に答える