2

テーブルに A、B、C、D の 4 つの列があるとします。A 列のみが一意性を定義するため、主キーとなります。B、C、D ではエントリを繰り返すことができるため、これらを複合代替キーとして使用することはできません。主キーと代替キーで同じ列を使用して、たとえば (A と B) のように代替キーを作成することはできますか?

4

2 に答える 2

4

私があなたの考えを理解できなかった場合を除き、MS SQL の場合は可能です。次のテストを見てください。

CREATE TABLE Alternate (
    A int IDENTITY(1,1) NOT NULL,
    B int NULL,
    C int NULL,
    D int NULL,
 CONSTRAINT PK_Alternate PRIMARY KEY (A),
 CONSTRAINT AK_Alternate Unique (A,B)
)
GO

insert into Alternate (B) values(1)
insert into Alternate (B) values(1)
insert into Alternate (B) values(1)
insert into Alternate (B) values(null)
insert into Alternate (B) values(null)
insert into Alternate (B) values(null)

select A, B from Alternate

結果は次のとおりです。

1 1

2 1

3 1

4ヌル

5ヌル

6 ヌル

于 2011-09-11T07:05:19.913 に答える
2

正式には:

  • 「スーパーキー」は、行を一意に識別することができる一連の属性です。
  • 「キー」は最小限のスーパーキーです。つまり、属性を削除すると、一意ではなくなります。

したがって、あなたの例では: {A, B} は最小ではないため、キーではありません(B を取り除いても一意性を維持できます)。

典型的な DBMSでは、PRIMARY KEY を「含む」UNIQUE 制約作成できますが、これは良い考えではありません。「すべてがキー、キー全体、およびキー以外に依存する必要がある」というデータベース設計原則に違反することになります。 "。


ところで、なぜあなたはとにかくそのようなことをしたいのですか? パフォーマンス上の理由から、2 つのインデックス ({A} と {A、B}) を回避しようとしているだけですか? その場合、「インデックス」と「キー」は 2 つの別個の概念であることに注意してください。前者は物理的/パフォーマンスに関連し、後者は論理的です。キーが (パフォーマンス上の理由から) インデックスによってサポートされることが多いという事実は、この区別をあいまいにするべきではありません。

DBMS によっては、{A} に INDEX を作成しなくても、{A, B} に INDEX を作成し、A に PRIMARY KEY を作成できる可能性があります。

于 2011-09-11T08:09:16.483 に答える