我们可以为一个外键引用两个不同的表吗?
Can we refer to two different tables for one foreign key?
我有这些表:
table1
-----------------------
tb1_id
name
other stuff
table2
-------------------------------
tb2_Id
other stuff
table 3
--------------------------------
id
ref Id ->either tb2_id or tb1_id
可以通过下面的代码实现吗?
CREATE TABLE `eloan`.`table3` (
`id` INTEGER UNSIGNED NOT NULL AUTO_INCREMENT,
`refId` VARCHAR(45) NOT NULL DEFAULT '',
PRIMARY KEY(`id`),
CONSTRAINT `refId` FOREIGN KEY `refId` (`refId`, `refId`)
REFERENCES `table2` (`tb2_id`, `tb1_id`)
ON DELETE RESTRICT
ON UPDATE RESTRICT
)
ENGINE = InnoDB;
此代码返回 "duplicate redid" 错误。
没有。这不可能。
如果您只想使用一个 refId
列,如您所示,您将无法 declare/define 外键约束来引用多个 table.
您可以在三个 table 上定义 BEFORE INSERT、BEFORE UPDATE 和 BEFORE DELETE 触发器,以执行一些完整性检查,并让触发器抛出一个 exception/error 以防止一些变化。
显然,您可以在 table3
中定义 两个 单独的列,一个可以是对 table1
的外键引用,另一个可以引用 [=13] =].您可以定义外键约束。
您可以允许两列都为 NULL。
如果您只想强制填充一列或另一列(至少一列必须为 NULL,另一列必须为 NOT NULL),您可以在 BEFORE INSERT
和 BEFORE UPDATE
触发器。
我有这些表:
table1
-----------------------
tb1_id
name
other stuff
table2
-------------------------------
tb2_Id
other stuff
table 3
--------------------------------
id
ref Id ->either tb2_id or tb1_id
可以通过下面的代码实现吗?
CREATE TABLE `eloan`.`table3` (
`id` INTEGER UNSIGNED NOT NULL AUTO_INCREMENT,
`refId` VARCHAR(45) NOT NULL DEFAULT '',
PRIMARY KEY(`id`),
CONSTRAINT `refId` FOREIGN KEY `refId` (`refId`, `refId`)
REFERENCES `table2` (`tb2_id`, `tb1_id`)
ON DELETE RESTRICT
ON UPDATE RESTRICT
)
ENGINE = InnoDB;
此代码返回 "duplicate redid" 错误。
没有。这不可能。
如果您只想使用一个 refId
列,如您所示,您将无法 declare/define 外键约束来引用多个 table.
您可以在三个 table 上定义 BEFORE INSERT、BEFORE UPDATE 和 BEFORE DELETE 触发器,以执行一些完整性检查,并让触发器抛出一个 exception/error 以防止一些变化。
显然,您可以在 table3
中定义 两个 单独的列,一个可以是对 table1
的外键引用,另一个可以引用 [=13] =].您可以定义外键约束。
您可以允许两列都为 NULL。
如果您只想强制填充一列或另一列(至少一列必须为 NULL,另一列必须为 NOT NULL),您可以在 BEFORE INSERT
和 BEFORE UPDATE
触发器。