2017-12-18 28 views
1

私は3つのテーブルをtableA、tableB、tableCとしましょう。これらのテーブルの 関係船は、以下のとおりです。SQL論理キー

  • TABLEB 1ににtableA多くにそれぞれ
  • TABLEC 1にTABLEB多くにそれぞれ

にtableA:

CREATE TABLE tableA (
id int Not Null, 
name varchar(50) Not Null, 
Area varchar(20) Not Null, 
CONSTRAINT PK_tableA PRIMARY KEY NONCLUSTERED(id Asc) WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, FILLFACTOR = 90) 
) 

TABLEB:

CREATE TABLE tableB (
id int Not Null, 
appNbr int NOT NULL, 
appCode char(8) NOT NULL, 
tableAId int Not Null, 
beginDt datetime Not Null, 
EndDt datetime Not Null, 
updatedDt datetime Not Null, 
CONSTRAINT PK_tableB PRIMARY KEY NONCLUSTERED(
id Asc, 
appNbr ASC, 
appCode ASC, 
tableAid ASC, 
beginDt ASC, 
endDt ASC 
) WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, FILLFACTOR = 90) 
) 
GO 

ALTER TABLE tableB WITH CHECK ADD CONSTRAINT FK_tableB_tableAId FOREIGN KEY(tableAId) 
REFERENCES tableA (Id) 
GO 

ALTER TABLE tableB CHECK CONSTRAINT FK_tableB_tableAId 
GO 

TABLEC:

CREATE TABLE tableC (
id int Not Null, 
tableBId int Not Null, 
beginDt datetime Not Null, 
endDt datetime Not Null, 
indicator char(1) Not Null, 
contactId int Not Null 
UpdateDt datetime Not Null, 
CONSTRAINT PK_tableC PRIMARY KEY NONCLUSTERED(
id ASC, 
tableBId Asc, 
beginDt ASC, 
endDt ASC 
) WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, FILLFACTOR = 90) 
) 

ALTER TABLE tableC WITH CHECK ADD CONSTRAINT FK_tableC_tableBId FOREIGN KEY(tableBId) 
REFERENCES tableB (Id) 
GO 

ALTER TABLE tableC CHECK CONSTRAINT FK_tableC_tableBId 
GO 

ここでの問題は、上の研究の後、私は、テーブルCを作成するスクリプトを実行すると、それは

There are no primary or candidate keys in the referenced table 
    'dbo.tableB' that match the referencing column list in the 
    foreign key 'FK_tableC_tableBId'. 
Msg 1750, Level 16, State 0, Line 2 
Could not create constraint. See previous errors. 

以下のようなエラーを示していますグーグル私はコンポジットプライマリキーからforiegnキーを作成することは許可されていないことを知りに来た。だから、私は私の主キーと残りのフィールド(appNbr、appCode、tableAid、beginDtとendDt)のIDをテーブルBの論理キーにすることにしました。私は論理キーについていくつかのオンライン資料を読みましたが、理解することはできません。

論理キーとは何ですか、私の例ではどのように使用できますか教えてください。

+0

おかげでアーロンを、私は上記の質問を投稿する前にそのリンクを見てきました。あなたは論理的な鍵についてもっと私に明確にすることができますか? –

答えて

1

TableB.idが一意であることは保証されていません。これは、外部キー参照の要件の1つです。したがって、IDをTableBの主キーCONSTRAINT PK_tableB PRIMARY KEY NONCLUSTERED(id)として使用するか、すべてのPK_tableB候補列CONSTRAINT FK_tableC_tableBId FOREIGN KEY(tableBId/*... and a column for each referenced column*/) REFERENCES tableB (id, appNbr, appCode, tableAid, beginDt, endDt)を参照してください。

+0

はい、私は、テーブルBのidだけをPKとして表記するか、talbleC FKの参照としてtableBのPKとして表されるすべての列をリストするオンラインでの説明を見ました。だから私はtableBのPKとしてIDを変更することにしましたが、ユニークな論理キーとしてtableBの他の列(appNbr、appCode、tableAid、beginDt、endDt)を作成する方法がわかりません –

+0

SQL Serverはまた、 「ユニークな制約」。それをチェックしてください:https://docs.microsoft.com/en-us/sql/relational-databases/tables/create-unique-constraints – zambonee

+0

SQLの論理キーとは何ですか? –

1

一般に、論理キーとは、データとテーブルの関係を定義するものです。主キーと外部キーは最も一般的な例ですが、一意かつ複合インデックスは同じ傘の下にあります。定義したFKと完全に一致するPKまたはユニークなインデックスを持つ必要があります。

あなたが問題を理解し、それを修正する方法のように聞こえるが、ここでは2つの方法があります。

  • tableB (id)に一意のインデックスを追加します。

    CREATE UNIQUE INDEX UI_bID ON dbo.tableB (id)

  • はあなたのPKを変更するにはtableBのみカバー(id)

例:

CREATE TABLE tableB (
id int Not Null, 
appNbr int NOT NULL, 
appCode char(8) NOT NULL, 
tableAId int Not Null, 
beginDt datetime Not Null, 
EndDt datetime Not Null, 
updatedDt datetime Not Null, 
CONSTRAINT PK_tableB PRIMARY KEY NONCLUSTERED(
id Asc 
) WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, FILLFACTOR = 90) 
) 

が次に一意のインデックス内の他の列が含ま:

CREATE UNIQUE INDEX UI_tableB ON dbo.tableB (
appNbr ASC, 
appCode ASC, 
tableAid ASC, 
beginDt ASC, 
endDt ASC)