使用复合主键在联结表上设置外键约束

Posted

技术标签:

【中文标题】使用复合主键在联结表上设置外键约束【英文标题】:Setting Foreign Key restraints on Junction table with a compound primary key 【发布时间】:2016-01-31 09:46:12 【问题描述】:

我有一个联结表,用于存储测试和测试中的问题之间的关系,将testFKquestionFK 设置为复合主键以防止重复条目。

连接表:

    +--------+------------+
    | testFK | questionFK |
    +--------+------------+
    |    7   |      1     |
    +--------+------------+
    |    7   |      2     |
    +--------+------------+
    |    7   |      3     |
    +--------+------------+
    |    8   |      4     |
    +--------+------------+
    |    8   |      5     |
    +--------+------------+
    |    8   |      6     |
    +--------+------------+

我想做的事:

test table 中删除testID 后,我希望将Junction Table 中带有testFK=8 的所有行也删除。

问题:

phpmyadmin 不允许我将 testFK 设置为来自 test tabletestIDforeign key

处理这种情况的最佳方法是什么?

感谢您的任何意见!

更新: 创建代码:

CREATE TABLE IF NOT EXISTS `junc_test_question` (
  `testFK` int(11) NOT NULL,
  `questionFK` int(11) NOT NULL,
  `ordinal` int(3) NOT NULL DEFAULT '1',
  PRIMARY KEY (`testFK`,`questionFK`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

【问题讨论】:

可能是这个答案:***.com/questions/19184538/… @MortenSickel 尝试此操作时出现相同的错误:#1452 - 无法添加或更新子行:外键约束失败(db_assess.#sql-2510_69, CONSTRAINT testFK FOREIGN关键(testFK)参考testtestID)) 请发布您的创建表代码 您可以为此创建触发器 【参考方案1】:
DROP TRIGGER remove_test_table
GO
CREATE TRIGGER remove_test_table
FOR DELETE
AS 
DELETE FROM test_table WHERE testFK IN (SELECT testFK FROM deleted);
GO

【讨论】:

请解释您的代码如何为问题提供解决方案。这有助于 OP 理解和应用您的代码,也有助于未来的搜索者。 当条目删除remove_test_table它删除所有与test_table相连的条目

以上是关于使用复合主键在联结表上设置外键约束的主要内容,如果未能解决你的问题,请参考以下文章

初学者必备:MySQL的主键,外键与唯一约束设置(点赞!!!)

通过 PhpMyAdmin 的复合外键约束?

联结表中的复合主键 - Sequelize

在联结表中,如果我需要一个单一的唯一标识符和一个单独的唯一复合标识符,它应该是主键?

仅在主表上作为复合主键

休眠。符合。在联结表中设置复合主键