2012-10-01 18 views
6

テーブルの外部キーを別のテーブルの複合プライマリキーの一部にすることはできますか?複合プライマリキーの一部であるSQLテーブルの外部キー

プロジェクト表:

Composite Primary Keys: UserId, ProjectId(どちらもユニークではない、私は2つのテーブルを持っている場合 は例えば、1は、異なるユーザのすべてのアクティブなプロジェクトやプロジェクトで使用されているものの機器上の他の情報を含む情報が含まれています

Composite Primary Keys: UserId, ProjectId, EquipmentId(いずれも

が今ある)それ自体がユニークであることは、PO:

機器表)、それ自体で機器テーブルのProjectIdをプロジェクトテーブルの外部キーに設定することはできますか?試してみると、Project Tableの列が既存の主キーまたは一意の制約と一致しないというエラーが表示されます。あなたが外部キー、あなたの他のテーブルにUNIQUEまたはPRIMARY KEY制約でなければならない「点がする」というキーを作成

+0

どのように複合主キーを定義しましたか? _each_列に一意の制約を追加しましたか? – Oded

+0

しかし、私は各列が一意であることを望んでいません。私は2つまたは3つの列の組み合わせをユニークにしたい。 – Tony

+0

私は制約をどのように定義したのか尋ねました。私はあなたがそのように定義する必要があるとは言いませんでした。 – Oded

答えて

8

。重複する値を許可する列を指す外部キーを確立することはできません。他のテーブル(たとえば)の重複値の1つを更新すると、データがどのように「動作する」べきかを想像するのは非常に難しいでしょう。あなたはPROJECTIDがUNIQUEであるプロジェクトテーブルまたはPRIMARY KEYを確立し、そのテーブルに両方他のテーブルの外部キーを指していなければなりませんやりたい

「プライマリキー」という用語を使用すると、プライマリキーを構成する各テーブルの列を記述できます。実際には、各テーブルには1つのプライマリキーしか存在できません。そのキーは1つまたは複数の列で構成できますが、キー自体は引き続き単数型と呼ばれます。主キーを使用して検索を最適化する場合の重要な違いです。

-1

@Larry Lustig 外部キーは、他のテーブルの主キーの一部にすることができます。

ソース:テーブル間のDependent relationship

チェック関係:Zdarzenie(イベント)とTypZdarzenia(イベントの種類)

football Competition - database

0

それは良いデザインの実践だ場合、それは知らないが、確かにそれ他の表の複合主キーの一部である1つの表の複合外部キーを持つことが可能です。

は、ここで、(P、Q)での主キー(P、Q、R)を有するTEST2言う今はテーブルを有することができる

我々は複合主キー(A、B)を有するテーブルTEST1があるとtest2は、test2の(A、B)を参照しています。

MySqlデータベースで次のスクリプトを実行しても問題ありません。上記の場合

CREATE TABLE `test1` (
`A` INT NOT NULL, 
`B` VARCHAR(2) NOT NULL, 
`C` DATETIME NULL, 
`D` VARCHAR(45) NULL, 
PRIMARY KEY (`A`, `B`)); 


CREATE TABLE `test2` (
`P` INT NOT NULL, 
`Q` VARCHAR(2) NOT NULL, 
`R` INT NOT NULL, 
`S` DATETIME NULL, 
`T` VARCHAR(8) NULL, 
PRIMARY KEY (`P`, `Q`, `R`), 
INDEX `PQ_idx` (`P`,`Q` ASC), 
CONSTRAINT `PQ` 
    FOREIGN KEY (`P`, `Q`) 
    REFERENCES `test1` (`A`,`B`) 
    ON DELETE CASCADE 
    ON UPDATE CASCADE); 

、データベースが一意である(A、B)の組み合わせを期待し、それは、TEST1テーブルの主キーです。


しかし、あなたは、次のような何かをしようとした場合、スクリプトは失敗します。データベースでは、test2テーブルを作成することはできません。データベースは、列Aを個別にユニークと同じであると期待される上記の場合

CREATE TABLE `test2` (
`P` INT NOT NULL, 
`Q` VARCHAR(2) NULL, 
`R` DATETIME NULL, 
`S` VARCHAR(8) NULL, 
`T` VARCHAR(45) NULL, 
    INDEX `P_idx` (`P` ASC), 
    INDEX `Q_idx` (`Q` ASC), 
    CONSTRAINT `P` 
    FOREIGN KEY (`P`) 
    REFERENCES `test1` (`A`) 
    ON DELETE CASCADE 
    ON UPDATE CASCADE, 
    CONSTRAINT `Q` 
    FOREIGN KEY (`Q`) 
    REFERENCES `test1` (`B`) 
    ON DELETE CASCADE 
    ON UPDATE CASCADE); 

(A、B)の組み合わせが一意である場合、列Bのそれは問題ではない以下。

関連する問題