web-dev-qa-db-ja.com

複数のテーブル/複数の外部キーからの複合主キー

2つの異なるテーブルの外部キーで構成される複合主キーを構築したいと思います。私はまだこれにかなり緑です...

この質問 で複数の外部キーから複合キーを作成するのに素晴らしい回答が得られましたが、これを複数のテーブルから実行したいと思います。 Oracle 11gを使用しています。

foreign key (Name, BoughtFrom, TimeBought) 
  references the_other_table_name (Name, BoughtFrom, TimeBought)

"references"行に実際に複数のテーブルが含まれていると想像してください。上記の構文がOracleで機能するかどうかさえわかりません。

「学生」というテーブルと「親」というテーブルがあります。それは多対多の関係です。私の関連付けテーブルの名前は「Relation」で、「PAR_ID」と「STU_ID」から複合主キーを作成したいと思います。どちらも外部キーです。

4
Shrout1

短縮版:

CREATE TABLE Relation
( stu_id INT NOT NULL REFERENCES Student,
  par_id INT NOT NULL REFERENCES Parent,
  PRIMARY KEY (stu_id, par_id)
) ;

ロングバージョン:

  • 名前にstu_idpar_idのような短い形式を使用する理由なぜstudent_id? 3〜4文字の入力を保存しますか? parent_idとparameter_idをどのように区別しますか?またはschool_idとschoolmaster_id?

  • 名前"Relation"は、関係を説明するものではありません。 (リレーショナルモデルの用語では、「リレーション」は「テーブル」に非常に近い意味を持っていることにも注意してください。)ただし、適切な名前を付けることができなかったため、"Guardian"または"Student_Parent"(この組み合わせは交差表でよく使用されます)

  • 上記の短いバージョンは単なる例です。動作中は、インライン参照などの多くのショートカットを使用します。以下の長いバージョンのように、すべての制約に名前を付けて、列宣言の後にすべての(主、一意、外部キーおよびチェック)制約を宣言する方が私の意見でははるかに優れています。

  • また、いくつかの命名規則を選択し、それらをすべてのテーブルで一貫して使用することもお勧めです。 Tablename_PKは主キー、ReferencedTable_referencingTable_FKは外部キー、Something_UQは一意の制約などです。

CREATE TABLE Guardian
(                                        -- columns
  student_id INT NOT NULL, 
  parent_id INT NOT NULL,
                                         -- constraints
  CONSTRAINT Guardian_PK                 -- the name of the PK constraint
    PRIMARY KEY (student_id, parent_id),

  CONSTRAINT Student_Guardian_FK         -- the name of the FK constraint
    FOREIGN KEY (student_id) 
    REFERENCES Student (student_id)
      ON UPDATE CASCADE                  -- the actions of the FK
      ON DELETE RESTRICT,
  CONSTRAINT Parent_Guardian_FK          -- second FK
    FOREIGN KEY (parent_id) 
    REFERENCES Parent (parent_id)
      ON UPDATE CASCADE
      ON DELETE RESTRICT
) ;
7
ypercubeᵀᴹ