我想对我的数据库进行分片,因此我无法使用外键约束。我有以下模型
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。
答案 0 :(得分:2)
感谢@dahrens我重新阅读了Django documentation并且说
在ForeignKey上自动创建数据库索引。您可以 通过将db_index设置为False来禁用此功能。你可能想避免 如果要创建外键以保持一致性,则索引的开销 而不是加入,或者如果你将创建一个替代索引 像部分或多列索引。