【发布时间】:2015-03-03 07:06:23
【问题描述】:
更新:进一步简化关于psql 试验的 Q:
对于以下 Django 模型:
class Book(models.Model):
name = models.TextField(unique=True)
pg_dump (PostgreSQL 9.3) 显示以下表格和约束:
CREATE TABLE book (
id integer NOT NULL,
name text NOT NULL,
);
ALTER TABLE ONLY book ADD CONSTRAINT book_name_key UNIQUE (name);
CREATE INDEX book_name_like ON book USING btree (name text_pattern_ops);
但是 PostgreSQL documentation 说:
PostgreSQL 自动创建唯一索引 约束 [...] 是为表定义的。
[...] 有 无需在唯一列上手动创建索引;这样做会 只需复制自动创建的索引即可。
问题:那么为什么 Django 会在唯一列上创建索引?也许理由是它使用了运算符类text_pattern_ops,因此Django 需要添加另一个索引。如果是这种情况,更好的方法是将 Django 的 unique=True 约束解释为:
CREATE UNIQUE INDEX book_name_like ON book USING btree (name text_pattern_ops);
并且在列中根本没有UNIQUE 约束。因此,单个 UNIQUE INDEX 和 text_pattern_ops 将导致 DB 不会为 UNIQUE 约束创建隐式索引。
【问题讨论】:
-
那个pg_dump SQL和Django's
sqlallcommand的输出一样吗? -
@KevinChristopherHenry 对于 Django 1.7,我正在使用
sqlmigrate,它应该与sqlall对迁移的应用程序执行相同的操作。是的,sql 是相似的。它在 create table 语句和另一个 create index 语句中有唯一约束。
标签: sql django postgresql django-models postgresql-9.3