为什么Django使用db_constraint = False为ForeignKey创建索引

时间:2017-10-29 14:03:12

标签: python mysql django

我想对我的数据库进行分片,因此我无法使用外键约束。我有以下模型

from django.db import models


class A(models.Model):
    b_one_to_one = models.OneToOneField(
        'B', on_delete=models.SET_NULL, db_constraint=False, null=True
    )

    b_one_to_many_null = models.ForeignKey(
        'B', on_delete=models.SET_NULL, db_constraint=False, null=True,
        related_name='+'
    )
    b_one_to_many_nothing = models.ForeignKey(
        'B', on_delete=models.DO_NOTHING, db_constraint=False,
        related_name='+'
    )


class B(models.Model):
    pass

python manage.py makemigrations命令生成以下sql代码

BEGIN;
--
-- Create model A
--
CREATE TABLE `a` (`id` integer AUTO_INCREMENT NOT NULL PRIMARY KEY);
--
-- Create model B
--
CREATE TABLE `b` (`id` integer AUTO_INCREMENT NOT NULL PRIMARY KEY);
--
-- Add field b_one_to_many_nothing to a
--
ALTER TABLE `a` ADD COLUMN `b_one_to_many_nothing_id` integer NOT NULL;
--
-- Add field b_one_to_many_null to a
--
ALTER TABLE `a` ADD COLUMN `b_one_to_many_null_id` integer NULL;
--
-- Add field b_one_to_one to a
--
ALTER TABLE `a` ADD COLUMN `b_one_to_one_id` integer NULL UNIQUE;
CREATE INDEX `a_b_one_to_many_nothing_id_4fca4209` ON `a` (`b_one_to_many_nothing_id`);
CREATE INDEX `a_b_one_to_many_null_id_e498aa17` ON `a` (`b_one_to_many_null_id`);
COMMIT;

据我所知,由于b_one_to_many_null设置,Django可能希望为on_delete=models.SET_NULL字段创建索引,但我不明白为什么需要{{1}的索引} field。

有没有办法关闭这个自动索引创建,或者它只是一个Django错误?

我正在使用Django 1.11.5。

1 个答案:

答案 0 :(得分:2)

感谢@dahrens我重新阅读了Django documentation并且说

  

在ForeignKey上自动创建数据库索引。您可以   通过将db_index设置为False来禁用此功能。你可能想避免   如果要创建外键以保持一致性,则索引的开销   而不是加入,或者如果你将创建一个替代索引   像部分或多列索引。