Изменить индекс в Postgres

Я столкнулся с проблемой в своем приложении django, пытаясь добавить значение модели. Кажется, что в базе данных есть ограничение, которого не должно быть, согласно models.py. Ошибка, которую я получаю:

IntegrityError: значение null в столбце "column_x_ptr_id" нарушает непустое ограничение

Выполняя a \dt в psql, я получаю:

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)

Я не уверен, что это решит проблему, хотя..

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 по соображениям производительности. Какой тип вы используете, зависит от вас.

+1
источник

Посмотрите другие вопросы по меткам или Задайте вопрос