PostgreSQL'de kısıtlama adı güncellemesi


91

Postgres'te kısıtlama adını değiştirmek mümkün müdür? Eklenen bir PK var:

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

Ve sistemin geri kalanıyla tutarlı olması için farklı bir isme sahip olmak istiyorum. Mevcut PK kısıtlamasını silip yeni bir tane oluşturmalı mıyım? Yoksa onu yönetmenin 'yumuşak' bir yolu var mı?

Teşekkürler!

Yanıtlar:


82

Birincil anahtar için şunları yapabilmelisiniz:

ALTER INDEX commerce_contractor_pkey RENAME TO whatever_new_name

Ancak bu, diğer kısıtlama türleri için işe yaramaz. En iyi seçenek eskisini bırakıp yeni bir tane oluşturmaktır. Bunu bir işlemin içinde yaptığınızdan emin olun, böylece sistem yeniden oluşturma sırasında onsuz yaşamaz. (Eğer bir işlemde bunu yapamaz eğer, yeni bir tane oluşturmak için mutlaka öncelikle eskisini düşmeden önce,)


155

PostgreSQL 9.2 veya daha yeni bir sürümde mevcut bir kısıtlamayı yeniden adlandırmak için ALTER TABLE kullanabilirsiniz :

ALTER TABLE name RENAME CONSTRAINT constraint_name TO new_constraint_name;

1
@ArturoHerrero birden fazla kısıtlamayı aynı anda yeniden adlandırabilir miyiz, evet ise nasıl?
Erlan

1
@Erlan pg_catalog, sorgu yoluyla tüm kısıtlamaların listesini elde edebilir , üzerinden yineleyebilir LOOPve yeniden adlandırmak için dinamik bir sorgu kullanabilirsiniz.
Evgeny Nozdrev

1

Birincil anahtarların genellikle ana tablo adının gerisinde kaldığını gördük. Bu komut dosyası, sorunlu olanları tanımlamamıza ve düzeltmemize yardımcı oldu.

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';

Bu, birincil anahtar adının artık "varsayılan" desen ( <tablename>_pkey) olmadığı tüm tabloları bulur ve her biri için bir yeniden adlandırma betiği oluşturur.

Yukarıdaki kodda yukarıdaki 58 karakterlik sınır, kısıtlama adlarının (63 bayt) maksimum boyutunu hesaba katmak içindir.

Açıkçası, çalıştırmadan önce neyin geri döndüğünü kontrol edin. Umarım başkaları için yararlıdır.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.