Чи можна додати UNIQUE обмеження до таблиці PostgreSQL, після того, як воно вже створене?


185

У мене є така таблиця:

 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обмеження в цей момент?


Відповіді:


363

psqlДовідкова інформація:

\h ALTER TABLE

Також задокументовано в документах postgres (відмінний ресурс, плюс також легкий для читання).

ALTER TABLE tablename ADD CONSTRAINT constraintname UNIQUE (columns);

6
дякую @hhaamu. Так, ви спробували документи, але ваше вище є набагато більш стислим.
Томас Браун

117
Якщо ви хочете дозволити PostgreSQL генерувати ім'я індексу, використовуйте ALTER TABLE tablename ADD UNIQUE (columns);. (Зверніть увагу, що CONSTRAINTключове слово потрібно пропустити.)
jpmc26

5
Мені була потрібна відповідь на це саме запитання і я почав гугліти для документів. Замість документації Postgres я натрапив на цю тему на StackOverflow. Тож хоча добре подумати про посилання на офіційні документи, також дуже добре дати відповідь на майбутні візити. Дякую тобі за це.
Леонард

@ jpmc26 «Якщо ви хочете дозволити PostgreSQL генерувати ім'я індексу» Ви маєте на увазі ім'я обмеження?
tuxayo

4
@tuxayo, унікальне обмеження реалізується через індекс у Postgres (не бути педантичним).
Кріс У.

36

Так, ти можеш. Але якщо у вас на столі є унікальні записи, вона вийде з ладу. Ось як додати унікальний обмеження на свій стіл. Якщо ви використовуєте PostgreSQL 9.x, ви можете слідувати інструкції нижче.

CREATE UNIQUE INDEX constraint_name ON table_name (columns);

3
Дякую Зеку - приємний 2й пізній відповідь, але все-таки вдячний, що люди все ще витрачають час! Tom
Thomas Browne

1
Це не правильно. В останніх Postgres це також призводить до того, що дублюється повідомлення типу "Key (uuid) = (3a533772-07ac-4e76-b577-27a3878e2222). Запит не вдався", якщо у вас є значення, яке не є унікальним ...
Strinder

3
@Strinder, як це не добре? спочатку виправте дублювані дані.
Ясен

3
@Jasen Це абсолютно зрозуміло. Просто хотів підкреслити, що відповідь "Але якщо у вас на столі є унікальні записи. Ось як додати унікальні обмеження на свій стіл". не вийде. Звичайно, унікальні записи повинні бути завжди консолідовані.
Стрінджер

Редагував відповідь на ясність
Ксав'є Хо

6

Якщо у вас була таблиця з уже наявними обмеженнями, що базується на тому, щоб сказати: ім'я та прізвище, і ви хотіли додати ще одне унікальне обмеження, вам довелося скинути всю обмеження:

ALTER TABLE your_table DROP CONSTRAINT constraint_name;

Переконайтеся, що новий обмеження, яке ви хотіли додати, є унікальним / ненульовим (якщо його Microsoft Sql, він може містити лише одне нульове значення) для всіх даних цієї таблиці, і тоді ви можете їх створити заново.

ALTER TABLE table_name
ADD CONSTRAINT constraint_name UNIQUE (column1, column2, ... column_n);

5

Так, ви можете додати Унікальне обмеження після факту. Однак якщо у вашій таблиці є унікальні записи, Postgres буде скаржитися на це, поки ви не виправите їх.


7
select <column> from <table> group by 1 having count(*) > 1;подасть звіт про дублювані значення.
Ясен
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.