Aktualizacja nazwy ograniczenia w PostgreSQL

91

Czy można zmienić nazwę ograniczenia w Postgres? Mam PK dodane z:

ALTER TABLE contractor_contractor ADD CONSTRAINT commerce_contractor_pkey PRIMARY KEY(id);

I chcę mieć dla niego inną nazwę, aby był spójny z resztą systemu. Czy mam usunąć istniejące ograniczenie PK i utworzyć nowe? A może istnieje „miękki” sposób na zarządzanie tym?

Dzięki!

Milen A. Radev
źródło

Odpowiedzi:

82

W przypadku klucza podstawowego powinieneś być w stanie po prostu:

ALTER INDEX commerce_contractor_pkey RENAME TO whatever_new_name

To jednak nie zadziała w przypadku innych typów ograniczeń. Najlepszą opcją jest porzucenie starego i utworzenie nowego. Pamiętaj, aby zrobić to wewnątrz transakcji, aby system nie działał bez niego podczas odbudowy. (A jeśli nie można tego zrobić w transakcji, należy utworzyć nowy pierwszy , przed zrzuceniem starego)

Magnus Hagander
źródło
155

Aby zmienić nazwę istniejącego ograniczenia w PostgreSQL 9.2 lub nowszym , możesz użyć ALTER TABLE :

ALTER TABLE name RENAME CONSTRAINT constraint_name TO new_constraint_name;
Arturo Herrero
źródło
1
@ArturoHerrero, czy moglibyśmy zmienić nazwę wielu ograniczeń jednocześnie, jeśli tak, to w jaki sposób?
Erlan
1
@Erlan możesz uzyskać listę wszystkich ograniczeń za pośrednictwem zapytania pg_catalog, iterować po niej LOOPi użyć dynamicznego zapytania do zmiany nazwy.
Evgeny Nozdrev
1

Okazało się, że klucze podstawowe często pozostają w tyle za nazwą tabeli głównej. Ten skrypt pomógł nam zidentyfikować i naprawić problemy.

select 
    table_name, 
    constraint_name , 
    'ALTER TABLE ' || table_name || ' RENAME CONSTRAINT ' || constraint_name || ' TO ' || left(table_name, 58) || '_pkey;'
from information_schema.table_constraints tc
where constraint_type  = 'PRIMARY KEY' 
and constraint_name <> left(table_name, 58) || '_pkey';

Znajduje to wszystkie tabele, w których nazwa klucza podstawowego nie jest już wzorcem „domyślnym” ( <tablename>_pkey), i tworzy dla każdej z nich skrypt zmiany nazwy.

Limit 58 znaków powyżej w powyższym kodzie ma uwzględniać maksymalny rozmiar nazw ograniczeń (63 bajty).

Oczywiście sensowne sprawdzenie, co jest zwracane przed uruchomieniem. Mam nadzieję, że to pomoże innym.

Paul Grimshaw
źródło