5

以下の表を宣言すると、外部キーが一意の主キーを作成することを暗に意味するか、または両方の属性を主キーとして作成するためにさらに何かを行う必要がありますか?他のテーブルから外部キーです主キーとしての複数の外部キー

CREATE TABLE Report_has_Items 
(
    ReportID int REFERENCES Report(ReportID) NOT NULL, 
    ItemID int REFERENCES Item(ItemID) NOT NULL 
) 

基本的に両方の属性は、一緒に一意のキーを形成することになります。

答えて

9

いいえ、それはありません。上記の表には主キーはありません。あなたのSQL dilectに応じて

CREATE TABLE Report_has_Items(
    ReportID int REFERENCES Report(ReportID) NOT NULL, 
    ItemID int REFERENCES Item(ItemID) NOT NULL, 
    PRIMARY KEY (ReportID, ItemID) 
) 

または類似した何か:あなたは主キーの使用などのフィールドを使用したい場合。

3

あなたの質問は完全にわかりませんが、複合主キー(複数の属性を持つ主キー)を作成しようとしていると思います。あなたは以下を行うことができます。

CREATE TABLE Report_has_Items(
    ReportID int references Report(ReportID), 
    ItemID int references Item(ItemID), 
    PRIMARY KEY (ReportID , ItemID) 
); 

:ペア(ReportID、アイテムID)は、テーブルに対して一意でなければならず、どちらの値がNULLであることができます。

Here is a very useful link for SQL Queries

5

えっ、私たちの制約に名前を付けましょうか!

CREATE TABLE dbo.Report_has_Items(
    ReportID int NOT NULL, 
     CONSTRAINT [FK_RHI_Report] (ReportId) REFERENCES dbo.Report(ReportID), 
    ItemID int NOT NULL, 
     Constraint [FK_RHI_Item] (ItemId) REFERENCES dbo.Item(ItemID), 
    CONSTRAINT [PK_RHI] PRIMARY KEY (ReportID, ItemID) 
) 
+0

制約の名前を付けるメリットは何ですか? – Kairan

+1

@ Kairan - 主な利点の1つは、クエリ(挿入、更新、削除)が制約に違反すると、制約名を含むエラーメッセージが生成されることです。制約名が明確でわかりやすい場合は、エラーメッセージがわかりやすくなります。制約名がランダムの場合は、それほど明確ではありません。 – Gayu

+0

私の主な理由は、環境全体の整合性です。私はサポートDBAです。その仕事の一部は、DEVからQAへの変更をPRODに移行することです。私はこれにスキーマ比較ツールを使用します。命名の相違が相違としてフラグが立てられないように、制約に同じ名前が付けられているといいですね。 –