Изменить уникальное ограничение в PSQL - PullRequest
0 голосов
/ 31 декабря 2018

У меня есть таблица адресов с уникальным ограничением на два поля: (адрес и имя хоста).Я понял, что мне нужно добавить еще 1 поле в ограничение.У меня есть кусок строки, который мне нужно вставить с одинаковым адресом и именем хоста, но не coin_id.При попытке вставить я получаю это.

ERROR:  duplicate key value violates unique constraint "address_uniq"
DETAIL:  Key (address, hostname)=(GfFrqCJtwuSSJyv6D1STtrT146N8p9cLtd, NHWithdrawal) already exists.
SQL state: 23505

Я пытался просмотреть свои ограничения следующим образом:

select * from information_schema.table_constraints
where constraint_type = 'UNIQUE'

Я не могу увидеть ограничение address_uniq в этом списке.

Как мне сделать следующее:

  1. Найти это ограничение с помощью psql
  2. Изменить / обновить это ограничение и добавить еще 1 столбец к нему

Ответы [ 2 ]

0 голосов
/ 31 декабря 2018

Ваш тип_ограничения также должен быть «ПЕРВИЧНЫЙ КЛЮЧ», поэтому лучший способ найти ограничение - использовать имя_ограничения.

select * from information_schema.table_constraints where constraint_name = 'address_uniq'

Вы можете удалить существующее ограничение

ALTER TABLE your_table_name DROP CONSTRAINT address_uniq;

и добавитьновый:

ALTER TABLE your_table_name ADD CONSTRAINT address_uniq PRIMARY KEY(address, hostname, coin_id);

или

ALTER TABLE your_table_name ADD CONSTRAINT address_uniq UNIQUE(address, hostname, coin_id);
0 голосов
/ 31 декабря 2018

[Как можно] Найти это ограничение с помощью psql

Мы можем получить то же сообщение об ошибке, если нарушим ограничение первичного ключа.

# alter table addresses add constraint addresses_pk primary key (id);
ALTER TABLE
# insert into addresses values (1, 2, 4, 4);
ERROR:  duplicate key value violates unique constraint "addresses_pk"
DETAIL:  Key (id)=(1) already exists.
# 

Попробуйте найти информационную схему where constraint_type = 'PRIMARY KEY'.

Обратите внимание, что нам не нужно присваивать имени первичному ключу имя, поскольку Postgres сгенерирует значение по умолчанию <table_name>_pkey.Таким образом, для того чтобы это было решением в вашем случае, это означает, что тот, кто создал первичный ключ, дал ему явное имя address_uniq, что могло бы сбить с толку.

Так что более вероятная возможность состоит в том, что у вас есть уникальный индексна этих столбцах.Индексы не отображаются в информационной схеме.Вы можете проверить это следующим образом:

select * from pg_indexes where tablename = 'addresses';

[Как я могу] Изменить / обновить это ограничение и добавить еще 1 столбец к нему

Если ваша проблемаindex, затем сделайте следующее:

# drop index address_uniq;
DROP INDEX
# create unique index address_uniq on addresses (address, hostname, coin_id);
CREATE INDEX
# 

Если выясняется, что это ограничение первичного ключа, это аналогичный процесс:

# alter table addresses drop constraint address_uniq;
ALTER TABLE
# alter table addresses add constraint address_uniq primary key (address, hostname,coin_id);
ALTER TABLE
# 
...