如果我在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 ;
Run Code Online (Sandbox Code Playgroud)
@ Skliwz,您能否提供更多关于如何使用触发器来提供此约束的详细信息?
@ boes,听起来不错.在您有孩子的情况下,它如何运作?例如,如果我们添加product_movie并使product_dvd成为product_movie的子项?使product_dvd的检查约束也必须考虑所有子类型,这是一个可维护性的噩梦吗?
通过在外键列上定义唯一约束,可以实现1:0-1或1:1的关系,因此只能存在一个组合.通常这将是子表的主键.
如果FK位于引用表的主键或唯一键上,它将它们约束为父表中存在的值,并且列上的唯一约束将它们限制为唯一性.这意味着子表只能具有与受约束列中的父对应的值,并且每行必须具有唯一值.这样做会强制子表最多只有一行对应父记录.
为了确保产品是 CD 或 DVD,我将添加一个类型列并将其作为主键的一部分。在派生列中,您添加类型的检查约束。在示例中,我将 cd 设置为 1,您可以为每个派生表设置 dvd = 2 等等。
CREATE TABLE IF NOT EXISTS `product` (
`product_id` int(10) unsigned NOT NULL auto_increment,
'product_type' int not null,
`product_name` varchar(50) NOT NULL,
`description` text NOT NULL,
PRIMARY KEY (`product_id`, 'product_type')
) ENGINE = InnoDB;
CREATE TABLE `product_cd` (
`product_id` INT UNSIGNED NOT NULL ,
'product_type' int not null default(1) check ('product_type' = 1)
`artist_name` VARCHAR( 50 ) NOT NULL ,
PRIMARY KEY ( `product_id`, 'product_type' ) ,
) ENGINE = InnoDB;
ALTER TABLE `product_cd` ADD FOREIGN KEY ( `product_id`, 'product_type' )
REFERENCES `product` (`product_id`, 'product_type')
ON DELETE RESTRICT ON UPDATE RESTRICT ;
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
17598 次 |
| 最近记录: |