Як просувати існуючий індекс до первинного ключа в PostgreSQL


13

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

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

Я створив індекс за допомогою:

CREATE INDEX my_index ON my_table (column1, column2)

Але я не знаю, як зробити це первинним ключем ...

ОНОВЛЕННЯ: Версія мого сервера - 8.3.3


1
Якщо my_index відображається як ім'я первинного ключа, тоді ви вже маєте індекс. У Postgres не існує ПК без унікального (унікального) індексу
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_" до назви моєї таблиці? У мене з’явилася синтаксична помилка із запитом "ПОМИЛКА: помилка синтаксису на рівні" USING "або поблизу символу 83"
WildBill

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


btw, "Якщо ТОЛЬКО вказано перед назвою таблиці, змінюється лише ця таблиця. Якщо ТОЛЬКО не вказано, таблиця та всі її нащадкові таблиці (якщо такі є) змінені."
Паоло
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.