2015-05-19 83 views
0

我有两个不相关的表,但每个人都有相同的列类型我叫“somefield”MySQL的多个外键约束

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`) 
) 

之后我插入这两种表,我插入此表'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 
) 

目前,如果我在表1中删除一行,同一行的表3中删除。我可以插入表1和做表3的插件没有任何问题,但如果我插入到表2,并试图插入表3我得到这个错误

完整性约束违规:1452不能添加或更新子行: 一个外键约束失败

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

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

我需要创建2个表充当table1/table3和table2/table3之间的行为吗?

回答

0

我能够通过创建其他3个表全部链接到的表来对此进行排序。

如果在新表中删除一行,则会在其他表中删除结果行。

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;