それは良いデザインの実践だ場合、それは知らないが、確かにそれ他の表の複合主キーの一部である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のそれは問題ではない以下。
どのように複合主キーを定義しましたか? _each_列に一意の制約を追加しましたか? – Oded
しかし、私は各列が一意であることを望んでいません。私は2つまたは3つの列の組み合わせをユニークにしたい。 – Tony
私は制約をどのように定義したのか尋ねました。私はあなたがそのように定義する必要があるとは言いませんでした。 – Oded