【问题标题】:MySQL multiple foreign key constraints on single tableMySQL对单个表的多个外键约束
【发布时间】:2015-05-19 13:34:55
【问题描述】:

我有 2 个不相关的表,但每个表都有相同的列类型,我称之为“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`)
)

在我插入这些表中的任何一个后,我将“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 我会收到此错误

违反完整性约束: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 之间的过渡吗?

【问题讨论】:

    标签: mysql foreign-keys constraints


    【解决方案1】:

    我可以通过创建一个其他 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;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-11-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多