【问题标题】:MySQL and Foreign KeysMySQL 和外键
【发布时间】:2011-11-16 22:23:36
【问题描述】:

我有一个关于 InnoDB 表中的外键的问题。我的数据库中有 4 个表:

注册:

  • UID - 主键
  • 相信
  • 平面
  • 行业标识

关联公司:

  • Afid - 主键

计划:

  • Planid - 主键

行业:

  • Industryid - 主键

我用来添加键的 SQL:

CONSTRAINT `FK_signup_industries` FOREIGN KEY (`industryid`) REFERENCES `industries` (`industryid`) ON UPDATE CASCADE ON DELETE CASCADE,
CONSTRAINT `FK_signup_affiliates` FOREIGN KEY (`afid`) REFERENCES `affiliates` (`afid`) ON UPDATE CASCADE ON DELETE CASCADE,
CONSTRAINT `FK_signup_plans` FOREIGN KEY (`planid`) REFERENCES `plans` (`planid`) ON UPDATE CASCADE ON DELETE CASCADE

我的问题是:

如果我要删除他们各自表格上的计划或行业,注册表格中的用户会被删除吗?我试图找到这方面的指南,但他们解释得不是很好。

基本上我需要做的是无论如何都永远不会删除注册表中的行。当我使用这个查询时:

CONSTRAINT `FK_signup_plans` FOREIGN KEY (`planid`) REFERENCES `plans` (`planid`) ON UPDATE CASCADE ON DELETE NO ACTION

我收到此错误:

Cannot delete a parent row.

【问题讨论】:

    标签: mysql foreign-keys innodb foreign-key-relationship


    【解决方案1】:

    如果您需要保留 Signup 中的行,即使您删除了 Industries、Affiliates 或 Plans 中的引用行,那么您有两种选择:

    • 不要声明外键约束。这消除了参照完整性的强制执行,但它允许在 Signup 中存在引用不再存在的父主键值的行。

    • 使用 ON DELETE SET NULL。这允许该行保留,但引用现在已删除的父级的外键值将被更改。*

    更多详情见http://dev.mysql.com/doc/refman/5.5/en/innodb-foreign-key-constraints.html

    * 标准 SQL 规范还定义了一条 ON DELETE SET DEFAULT 规则,但 InnoDB 不支持此功能。

    【讨论】:

    • 所以没有办法将删除时的值更改为我选择的值(例如 5 或 6)?
    • 您可以编写一个触发器来执行此操作。或者在删除它引用的父级之前使用 UPDATE 从应用程序代码中更改它。
    猜你喜欢
    • 2010-12-21
    • 2017-08-27
    • 2021-04-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多