Pembaruan nama batasan di PostgreSQL

91

Apakah mungkin untuk mengubah nama batasan di Postgres? Saya memiliki PK yang ditambahkan dengan:

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

Dan saya ingin memiliki nama yang berbeda untuk itu, agar konsisten dengan sistem lainnya. Haruskah saya menghapus batasan PK yang ada dan membuat yang baru? Ataukah ada cara yang 'lunak' untuk mengelolanya?

Terima kasih!

Milen A. Radev
sumber

Jawaban:

82

Untuk kunci utama, Anda harus bisa:

ALTER INDEX commerce_contractor_pkey RENAME TO whatever_new_name

Itu tidak akan berfungsi untuk jenis kendala lain. Pilihan terbaik adalah melepaskan yang lama dan membuat yang baru. Pastikan untuk melakukannya di dalam transaksi, sehingga sistem tidak hidup tanpanya selama pembangunan kembali. (Dan jika Anda tidak dapat melakukannya dalam transaksi, pastikan untuk membuat yang baru terlebih dahulu , sebelum melepaskan yang lama)

Magnus Hagander
sumber
155

Untuk mengganti nama batasan yang ada di PostgreSQL 9.2 atau yang lebih baru , Anda dapat menggunakan ALTER TABLE :

ALTER TABLE name RENAME CONSTRAINT constraint_name TO new_constraint_name;
Arturo Herrero
sumber
1
@ArturoHerrero Bisakah kita melakukan renaming pada beberapa batasan sekaligus, jika ya, bagaimana?
Erlan
1
@Erlan Anda bisa mendapatkan daftar semua batasan melalui kueri ke pg_catalog, mengulanginya melalui LOOPdan menggunakan kueri dinamis untuk mengganti nama.
Evgeny Nozdrev
1

Kami menemukan bahwa kunci utama sering tertinggal di belakang nama tabel utama. Skrip ini membantu kami mengidentifikasi dan memperbaiki masalah.

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

Ini menemukan semua tabel di mana nama kunci utama tidak lagi menjadi pola "default" ( <tablename>_pkey) dan membuat skrip ganti nama untuk masing-masing.

Batas 58 karakter di atas pada kode di atas adalah untuk memperhitungkan ukuran maksimum nama batasan (63bytes).

Jelas merasakan memeriksa apa yang dikembalikan sebelum menjalankannya. Semoga bermanfaat bagi orang lain.

Paul Grimshaw
sumber