如果我在MySQL中有一個代表基類的表,並且我有一堆代表派生類中的字段的表,每個表都用外鍵引用基表,有沒有辦法讓MySQL執行派生表和基表之間的一對一關係,還是必須在代碼中完成?MySQL外鍵 - 如何跨表執行一對一的操作?
使用以下快速「N」髒架構作爲一個例子,有沒有什麼辦法讓MySQL來確保兩個product_cd和product_dvd行不能共享相同的product_id?是否有更好的方法來設計模式以允許數據庫強制執行這種關係,還是根本無法實現?
CREATE TABLE IF NOT EXISTS `product` (
`product_id` int(10) unsigned NOT NULL auto_increment,
`product_name` varchar(50) NOT NULL,
`description` text NOT NULL,
PRIMARY KEY (`product_id`)
) ENGINE = InnoDB;
CREATE TABLE `product_cd` (
`product_cd_id` INT UNSIGNED NOT NULL AUTO_INCREMENT ,
`product_id` INT UNSIGNED NOT NULL ,
`artist_name` VARCHAR(50) NOT NULL ,
PRIMARY KEY (`product_cd_id`) ,
INDEX (`product_id`)
) ENGINE = InnoDB;
ALTER TABLE `product_cd` ADD FOREIGN KEY (`product_id`)
REFERENCES `product` (`product_id`)
ON DELETE RESTRICT ON UPDATE RESTRICT ;
CREATE TABLE `product_dvd` (
`product_dvd_id` INT UNSIGNED NOT NULL AUTO_INCREMENT ,
`product_id` INT UNSIGNED NOT NULL ,
`director` VARCHAR(50) NOT NULL ,
PRIMARY KEY (`product_dvd_id`) ,
INDEX (`product_id`)
) ENGINE = InnoDB;
ALTER TABLE `product_dvd` ADD FOREIGN KEY (`product_id`)
REFERENCES `product` (`product_id`)
ON DELETE RESTRICT ON UPDATE RESTRICT ;
@Skliwz,可以請你提供有關觸發器如何被用來執行這項約束與模式提供了更多的細節?
@boes,聽起來不錯。在有孩子的孩子的情況下,它是如何工作的?例如,如果我們添加了product_movie並將product_dvd作爲product_movie的子項?將product_dvd的檢查約束限制在所有子類型中是否會成爲可維護性的噩夢?
使用註釋而不是編輯你的問題。 – epochwolf 2008-09-22 13:36:46