bu iyi bir tasarım uygulamadır eğer bilmiyorum ama herhalde Diğer tablonun birleşik ana anahtarının bir parçası olan bir tablonun birleşik bir dış anahtarının bulunması mümkündür.
biz sahip test2 demek bir birincil anahtar (A, B)
Şimdi bir tablo olabilir sahip olan bir masa test1 var ki birincil anahtar (P, Q, R) burada (P, Q) içinde Test2'nin test2 referansı (A, B).
Aşağıdaki komut dosyasını MySql veritabanında çalıştırdım ve gayet iyi çalışıyor.Yukarıda belirtilen durumda
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);
CREATE TABLE `test1` (
`A` INT NOT NULL,
`B` VARCHAR(2) NOT NULL,
`C` DATETIME NULL,
`D` VARCHAR(45) NULL,
PRIMARY KEY (`A`, `B`));
, veritabanı kombinasyonu bekliyor, (A, B), benzersiz olması ve Test1 tabloda birincil anahtar olmak vardır.
Ama aşağıdaki gibi bir şey yapmak çalışırsanız, komut başarısız olur. Veritabanı, test2 tablosunu oluşturmanıza izin vermez. kombinasyonu (A, B) benzersiz olup olmadığını önemli değildir yukarıda belirtilen vaka veritabanında
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 sütunu ayrı ayrı benzersiz olması beklenir ve aynı kolon B için izler.
Birleşik birincil anahtarı nasıl tanımladınız? _each_ sütununda benzersiz bir kısıtlama eklediniz mi? – Oded
Ancak, her sütunun benzersiz olmasını istemiyorum. İki ya da üç sütunun bir kombinasyonu benzersiz olmak istiyorum. – Tony
Kısıtlamaları nasıl tanımladığınızı sordum. Onları böyle tanımlamalısın demedim. – Oded