Postgres中的变化指数

时间:2018-05-09 10:48:40

标签: postgresql indexing unique-constraint data-integrity

在尝试向模型添加值时,我的django应用程序遇到了问题。根据models.py,似乎DB中存在一个不应存在的约束。我得到的错误是:

  

IntegrityError:“column_x_ptr_id”列中的空值违反非空约束

在psql中执行\dt,我得到:

Indexes:
    "mytable_model_pkey" PRIMARY KEY, btree (column_x_ptr_id)
    "mytable_model_p_key" UNIQUE CONSTRAINT, btree (column_y_ptr_id)

所以,我的问题是如何修改这个索引呢?

  

“mytable_model_pkey”PRIMARY KEY,btree(column_y_ptr_id)

我不确定这会解决问题..

1 个答案:

答案 0 :(得分:1)

好的,这会给你一个“或多或少”你需要做的事情。你的表看起来像这样:

CREATE TABLE mytable_model
(
  column_x_ptr_id integer NOT NULL,
  column_y_ptr_id integer,
  CONSTRAINT mytable_model_pkey PRIMARY KEY (column_x_ptr_id),
  CONSTRAINT mytable_model_p_key UNIQUE (column_y_ptr_id)
)

您需要删除这两个索引,在第二列上创建一个新的PK,并删除NOT NULL约束:

ALTER TABLE mytable_model DROP CONSTRAINT mytable_model_pkey;
ALTER TABLE mytable_model DROP CONSTRAINT mytable_model_p_key;
ALTER TABLE mytable_model ADD CONSTRAINT mytable_model_pkey PRIMARY KEY (column_y_ptr_id);
ALTER TABLE mytable_model ALTER COLUMN column_x_ptr_id DROP NOT NULL;

请注意,向column_y_ptr_id添加主键会将列更改为NOT NULL。如果该字段中的任何记录都为NULL,则会失败。然后正如我所提到的,出于性能原因,您可能希望在column_x_ptr_id上放置另一个索引。你使用什么类型取决于你。