Могу ли я добавить ограничение UNIQUE в таблицу PostgreSQL после того, как она уже создана?

190

У меня есть следующая таблица:

 tickername | tickerbbname  | tickertype
------------+---------------+------------
 USDZAR     | USDZAR Curncy | C
 EURCZK     | EURCZK Curncy | C
 EURPLN     | EURPLN Curncy | C
 USDBRL     | USDBRL Curncy | C
 USDTRY     | USDTRY Curncy | C
 EURHUF     | EURHUF Curncy | C
 USDRUB     | USDRUB Curncy | C

Я не хочу, чтобы когда - либо быть более чем один столбец для любой tickername/ tickerbbnameпары. Я уже создал таблицу и в ней много данных (которые, как я уже убедился, соответствуют уникальным критериям). Однако по мере того, как он становится больше, появляется пространство для ошибок.

Есть ли способ добавить UNIQUEограничение на этом этапе?

Томас Браун
источник

Ответы:

374

psqlвстроенная справка:

\h ALTER TABLE

Также задокументировано в документации postgres (отличный ресурс, к тому же легко читаемый).

ALTER TABLE tablename ADD CONSTRAINT constraintname UNIQUE (columns);
ххааму
источник
6
спасибо @hhaamu. Да, вы пробовали документы, но ваше выше намного более лаконично.
Thomas Browne
120
Если вы хотите, чтобы PostgreSQL генерировал имя индекса, используйте ALTER TABLE tablename ADD UNIQUE (columns);. (Обратите внимание, что CONSTRAINTключевое слово необходимо опустить.)
jpmc26
6
Мне нужен был ответ на этот вопрос, и я начал искать документы в Google. Вместо документации Postgres я столкнулся с этой темой на StackOverflow. Так что, хотя рекомендуется ссылаться на официальные документы, также очень хорошо дать ответ для будущих посещений. Спасибо тебе за это.
Леонард
@ jpmc26 «Если вы хотите, чтобы PostgreSQL генерировал имя индекса» Вы имеете в виду имя ограничения?
tuxayo
4
@tuxayo, ограничение уникальности реализовано через индекс в Postgres (не педантично).
Крис В.
38

Да, ты можешь. Но если в вашей таблице есть неуникальные записи, это не удастся. Вот как добавить уникальное ограничение в вашу таблицу. Если вы используете PostgreSQL 9.x, следуйте приведенным ниже инструкциям.

CREATE UNIQUE INDEX constraint_name ON table_name (columns);
Зек
источник
3
Спасибо, Зек - хороший ответ на 2 года позже, но все же ценю, что люди все еще находят время! Том
Томас Браун
1
Это не так. В последних версиях Postgres это также приводит к сообщению типа «Key (uuid) = (3a533772-07ac-4e76-b577-27a3878e2222) дублируется. Запрос не выполнен», если у вас есть значение, которое не является уникальным ...
Strinder
3
@ Стриндер, как это нехорошо? сначала исправьте повторяющиеся данные.
Jasen
3
@Jasen Это совершенно ясно. Просто хотел подчеркнуть, что ответ «Но если у вас есть неуникальные записи в вашей таблице. Вот как добавить уникальное ограничение в вашу таблицу». не будет работать. Неуникальные записи, конечно, всегда должны быть объединены заранее.
Стриндер
Отредактировал ответ для ясности
Ксавье Хо
6

Если у вас была таблица, в которой уже были существующие ограничения, основанные на let say: name и lastname, и вы хотели добавить еще одно уникальное ограничение, вам нужно было полностью удалить ограничение:

ALTER TABLE your_table DROP CONSTRAINT constraint_name;

Убедитесь, что новое ограничение, которое вы хотите добавить, является уникальным / не нулевым (если это Microsoft Sql, оно может содержать только одно нулевое значение) для всех данных в этой таблице, а затем вы можете воссоздать его.

ALTER TABLE table_name
ADD CONSTRAINT constraint_name UNIQUE (column1, column2, ... column_n);
Лукас Кампос
источник
5

Да, вы можете добавить ограничение UNIQUE постфактум. Однако, если в вашей таблице есть неуникальные записи, Postgres будет жаловаться на это, пока вы их не исправите.

Джордан С. Джонс
источник
7
select <column> from <table> group by 1 having count(*) > 1;даст отчет о повторяющихся значениях.
Jasen