Postgres 中的更改索引

Change Index in Postgres

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

IntegrityError: null value in column "column_x_ptr_id" violates not-null constraint

在 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)

虽然我不确定这是否能解决问题..

好的,这会给你一个 "more or less" 你需要做什么。您的 table 看起来像这样:

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 上放置另一个索引。你使用什么类型由你决定。