9

テーブルの外部キーを別のテーブルの複合主キーの一部にすることは可能ですか?たとえば、2つのテーブルがある場合、1つにはさまざまなユーザーのすべてのアクティブなプロジェクトに関する情報が含まれ、もう1つにはプロジェクトで使用されている機器に関する情報が含まれます。

プロジェクトテーブル:

Composite Primary Keys: UserId, ProjectId(どちらもそれ自体でユニークではありません)

機器テーブル:

Composite Primary Keys: UserId, ProjectId, EquipmentId (どちらもそれ自体でユニークではありません)

これで、機器テーブルのProjectIdをプロジェクトテーブルの外部キーに設定できますか?試してみると、プロジェクトテーブルの列が既存の主キーまたは一意性制約と一致しないというエラーが表示されますか?

4

3 に答える 3

14

いいえ。

外部キーを作成する場合、他のテーブルで「ポイントする」キーは、UNIQUEまたはPRIMARYKEY制約である必要があります。重複する値を許可する列を指す外部キーを確立することはできません。たとえば、他のテーブルの重複する値の1つを更新した場合、データがどのように「動作」するかを想像するのは非常に困難です。

必要なことを行うには、ProjectIDがUNIQUEまたはPRIMARY KEYであるProjectsテーブルを確立してから、他の両方のテーブルの外部キーをそのテーブルにポイントする必要があります。

括弧内に、「主キー」という用語を使用して、主キーを構成する各テーブルの列を説明します。実際、各テーブルは1つだけの主キーを持つことができます。そのキーは1つ以上の列で構成できますが、キー自体は単数形で参照されます。これは、主キーを使用して検索を最適化する場合の重要な違いです。

于 2012-10-01T19:06:53.557 に答える
-1

それが優れた設計手法であるかどうかはわかりませんが、他のテーブルの複合主キーの一部である1つのテーブルの複合外部キーを持つことは確かに可能です。

複合主キー(A、B)を持つテーブルtest1があるとします。

これで、主キー(P、Q、R)を持つtest2というテーブルを作成できます。ここで、test2の(P、Q)は、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テーブルを作成できません。

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についても同じことが続きます。(A、B)の組み合わせが一意であるかどうかは関係ありません。

于 2017-02-21T20:14:20.530 に答える
-2

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

ソース:依存関係

テーブル間の関係を確認します:Zdarzenie(イベント)とTypZdarzenia(イベントのタイプ)

サッカー大会-データベース

于 2015-08-18T10:48:25.637 に答える