Как перевести существующий индекс в первичный ключ в PostgreSQL

13

Я знаю, как сделать первичный ключ в таблице, но как сделать существующий индекс первичным ключом? Я пытаюсь скопировать существующую таблицу из одной базы данных в другую. Когда я показываю таблицу, индекс внизу имеет вид:

"my_index" PRIMARY KEY, btree (column1, column2)

Я создал индекс с:

CREATE INDEX my_index ON my_table (column1, column2)

Но я не знаю, как сделать его первичным ключом ...

ОБНОВЛЕНИЕ: версия моего сервера 8.3.3

WildBill
источник
1
Если в качестве имени первичного ключа отображается my_index, то у вас уже есть индекс. В Postgres нет PK без (уникального) индекса
a_horse_with_no_name
1
какая у вас версия PostgreSQL?
filiprem
Я бегу 8.3.3
WildBill

Ответы:

16

Вы бы использовали ALTER TABLE, чтобы добавить ограничение первичного ключа . В Postgres вы можете «продвигать» индекс, используя ALTER TABLE .. ADD table_constraint_using_indexформу « »

Обратите внимание, индекс должен быть уникальным, конечно, для первичного ключа

ALTER TABLE my_table 
    ADD CONSTRAINT PK_my_table PRIMARY KEY USING INDEX my_index;
ГБН
источник
Это не сработало для меня. Что такое PK_my_table? Я предполагаю, что это метка, и я добавляю 'PK_' к имени моей таблицы? Я получил синтаксическую ошибку, говорящую «ОШИБКА: синтаксическая ошибка в или около« ИСПОЛЬЗОВАНИЕ »в
символе
1
@ngramsky: USING INDEXдоступно с 9.1. Так что я думаю, что вы не используете текущую версию
a_horse_with_no_name
Нет, я использую 8.3.3. Как мне поступить так в 8.3.3?
WildBill
5
Единственный способ сделать это в этой древней версии - удалить индекс и добавить новое ограничение pk.
a_horse_with_no_name
2
@a_horse_with_no_name: вы должны сделать этот ответ: ваш комментарий предшествует другому ответу ...
gbn
7

Я не думаю, что возможно преобразовать индекс в первичный ключ в этой версии postgresql.

Я бы просто отбросил существующий индекс и создал бы первичный ключ, используя указанные вами столбцы.

DROP INDEX my_index;
ALTER TABLE ONLY my_table ADD CONSTRAINT pk_my_table PRIMARY KEY(column1,column2);

Работал в 7.4 и 8.4

Крейг Эфрейн
источник
Кстати, «Если перед именем таблицы указано ТОЛЬКО, изменяется только эта таблица. Если НЕ указано ТОЛЬКО, изменяются таблица и все ее дочерние таблицы (если таковые имеются)».
Паоло