Изменить индекс в Postgres - PullRequest
0 голосов
/ 09 мая 2018

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

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

Делая \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" ПЕРВИЧНЫЙ КЛЮЧ, btree (column_y_ptr_id)

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

1 Ответ

0 голосов
/ 09 мая 2018

Хорошо, это даст вам «более или менее» то, что вам нужно сделать. Ваш стол выглядит примерно так:

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

...