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;
我有 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;