MySQL 单个 table 上的多个外键约束

MySQL multiple foreign key constraints on single table

我有 2 个不相关的 table,但每个都有相同的列类型,我称之为 'somefield'

CREATE TABLE `table1` (
 `id` int(10) NOT NULL AUTO_INCREMENT,
 `somefield` varchar(255) NOT NULL DEFAULT '',
 PRIMARY KEY (`id`),
 UNIQUE KEY `somefield` (`somefield`),
)

CREATE TABLE `table2` (
 `id` int(5) NOT NULL AUTO_INCREMENT,
 `somefield` int(20) DEFAULT NULL,
 PRIMARY KEY (`id`),
 UNIQUE KEY `somefield` (`somefield`)
)

在我插入其中任何一个 table 之后,我将 table 插入 'somefield' 值。

CREATE TABLE `table3` (
 `id` int(10) NOT NULL AUTO_INCREMENT,
 `somefield` varchar(255) NOT NULL DEFAULT '',
 PRIMARY KEY (`id`),
 UNIQUE KEY `somefield` (`somefield`),
 CONSTRAINT `FK_table3` FOREIGN KEY (`somefield`) REFERENCES `table1` (`somefield`) ON DELETE CASCADE ON UPDATE CASCADE
)

目前,如果我在 table1 中删除一行,则同一行会在 table3 中删除。我可以插入 table1 并在 table3 上插入而没有任何问题,但是如果我插入 table2 并尝试插入 table3 我会收到此错误

Integrity constraint violation: 1452 Cannot add or update a child row: a foreign key constraint fails

我知道这与外键约束有关,因为它期望 'somefield' 值出现在 table1 中。我想知道的是如何添加另一个约束。

ALTER TABLE table3 ADD CONSTRAINT FK_table3 FOREIGN KEY (`somefield`) REFERENCES `table2` (`somefield`)  ON DELETE CASCADE ON UPDATE CASCADE;

我是否需要创建 2 个 table 作为 table1/table3 和 table2/table3 之间的过渡?

我能够通过创建一个 table 来对此进行排序,其他 3 table 全部 link 到。

如果在新 table 中删除了一行,则结果行将在其他 table 中删除。

CREATE TABLE IF NOT EXISTS `table1` (
  `id` tinyint(3) NOT NULL AUTO_INCREMENT,
  `somefield` varchar(12) DEFAULT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `somefield` (`somefield`)
);

CREATE TABLE IF NOT EXISTS `table2` (
  `id` tinyint(3) NOT NULL AUTO_INCREMENT,
  `somefield` varchar(12) DEFAULT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `somefield` (`somefield`)
);

CREATE TABLE IF NOT EXISTS `table3` (
  `id` tinyint(3) NOT NULL AUTO_INCREMENT,
  `somefield` varchar(12) DEFAULT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `somefield` (`somefield`)
);

CREATE TABLE IF NOT EXISTS `supertable` (
  `somefield` varchar(12) NOT NULL DEFAULT '',
  PRIMARY KEY (`somefield`),
  UNIQUE KEY `somefield` (`somefield`)
);

ALTER TABLE `table1`
  ADD CONSTRAINT `FK_table1` FOREIGN KEY (`somefield`) REFERENCES `supertable` (`somefield`) ON DELETE CASCADE ON UPDATE CASCADE;

ALTER TABLE `table2`
  ADD CONSTRAINT `FK_table2` FOREIGN KEY (`somefield`) REFERENCES `supertable` (`somefield`) ON DELETE CASCADE ON UPDATE CASCADE;

ALTER TABLE `table3`
  ADD CONSTRAINT `FK_table3` FOREIGN KEY (`somefield`) REFERENCES `supertable` (`somefield`) ON DELETE CASCADE ON UPDATE CASCADE;