【问题标题】:How to update case of field with FK constraint to it如何更新具有 FK 约束的字段案例
【发布时间】:2015-10-31 06:07:51
【问题描述】:

我希望标准化我的数据库中的字段。如果该字段对其有 FK 约束,我将如何执行以下操作:

在 Django 中:

Platform.objects.filter(name='ITUNES').update(name='iTunes')
# gives FK error

在mysql中:

update main_platform set name='iTunes' where name='ITUNES'
# Cannot delete or update a parent row: a foreign key constraint fails (`avails`.`main_credit`, CONSTRAINT `main_credit_ibfk_3` FOREIGN KEY (`platform_id`) REFERENCES `main_platform` (`name`))

解决办法是什么?

请注意,我不希望添加其他字段,例如 ID 字段,其中 FK 永远不会改变,我只对更新现有字段感兴趣。

我为平台拥有的当前表是:

CREATE TABLE `main_platform` (
  `name` varchar(20) NOT NULL,
  `guid` varchar(40) DEFAULT NULL,
  PRIMARY KEY (`name`),
  KEY `guid` (`guid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

【问题讨论】:

  • 您需要提供更多信息。这个字段是什么类型的?什么是约束?
  • @DanielRoseman 请查看更新后的问题。

标签: mysql django


【解决方案1】:

请务必先关闭您的应用程序,因为此设置是系统范围的。

from django.db import connection

assert connection.vendor == 'mysql'
cursor = connection.cursor()
cursor.execute("SET FOREIGN_KEY_CHECKS = 0")

try:
    # do your data migration here
finally:
    cursor.execute("SET FOREIGN_KEY_CHECKS = 1")

来自文档的警告:

foreign_key_checks = 0 时添加到表中的行将不会进行一致性验证

您可能还想查看this question

不过,您确实应该使用数字 ID。

【讨论】:

    【解决方案2】:

    这看起来更像是一个 SQL 问题。

    你有name作为主键,所以如果你试图在链接表中有行引用它时直接更新它,那么事情肯定会中断。​​

    如果您不打算修改表以使用数字 id 作为主键(这将是一个非常好的主意),那么我能看到的最好的实际选择是添加一个新行main_platform 使用新名称字段(iTunes vs ITUNES),然后迁移任何相关数据以指向该新行,最后删除旧行。

    请参阅this 回答以更深入地了解问题,并希望被说服并使用数字 id 作为您的主键。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-23
      • 1970-01-01
      相关资源
      最近更新 更多