2つの異なるテーブルの外部キーで構成される複合主キーを構築したいと思います。私はまだこれにかなり緑です...
この質問 で複数の外部キーから複合キーを作成するのに素晴らしい回答が得られましたが、これを複数のテーブルから実行したいと思います。 Oracle 11gを使用しています。
foreign key (Name, BoughtFrom, TimeBought)
references the_other_table_name (Name, BoughtFrom, TimeBought)
"references"行に実際に複数のテーブルが含まれていると想像してください。上記の構文がOracleで機能するかどうかさえわかりません。
「学生」というテーブルと「親」というテーブルがあります。それは多対多の関係です。私の関連付けテーブルの名前は「Relation」で、「PAR_ID」と「STU_ID」から複合主キーを作成したいと思います。どちらも外部キーです。
短縮版:
CREATE TABLE Relation
( stu_id INT NOT NULL REFERENCES Student,
par_id INT NOT NULL REFERENCES Parent,
PRIMARY KEY (stu_id, par_id)
) ;
ロングバージョン:
名前にstu_id
やpar_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
) ;