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


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

 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 ограничения на данный момент?

4 127

4 ответа:

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

\h ALTER TABLE

также зафиксированы в postgres docs (отличный ресурс, плюс легко читается, тоже).

ALTER TABLE tablename ADD CONSTRAINT constraintname UNIQUE (columns);

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

CREATE UNIQUE INDEX constraint_name ON table_name (columns);

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

Если у вас была таблица, которая уже имела существующие ограничения, основанные на lets 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);