如果我在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