อัปเดตชื่อข้อ จำกัด ใน PostgreSQL


94

เป็นไปได้ไหมที่จะเปลี่ยนชื่อข้อ จำกัด ใน Postgres ฉันมี PK เพิ่มด้วย:

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

และฉันต้องการใช้ชื่ออื่นเพื่อให้สอดคล้องกับส่วนที่เหลือของระบบ ฉันจะลบข้อ จำกัด PK ที่มีอยู่และสร้างใหม่ได้หรือไม่? หรือมีวิธีจัดการแบบ 'มั่วนิ่ม' หรือไม่?

ขอบคุณ!

คำตอบ:


83

สำหรับคีย์หลักคุณควรทำได้เพียง:

ALTER INDEX commerce_contractor_pkey RENAME TO whatever_new_name

ซึ่งจะใช้ไม่ได้กับข้อ จำกัด ประเภทอื่น ๆ ตัวเลือกที่ดีที่สุดคือทิ้งอันเก่าแล้วสร้างอันใหม่ อย่าลืมทำภายในธุรกรรมดังนั้นระบบจะไม่สามารถใช้งานได้หากไม่มีในระหว่างการสร้างใหม่ (และถ้าคุณไม่สามารถทำมันได้ในการทำธุรกรรมให้แน่ใจว่าจะสร้างใหม่เป็นครั้งแรกก่อนที่จะทิ้งคนเก่า)


160

ในการเปลี่ยนชื่อข้อ จำกัด ที่มีอยู่ใน PostgreSQL 9.2 หรือใหม่กว่าคุณสามารถใช้ALTER TABLE :

ALTER TABLE name RENAME CONSTRAINT constraint_name TO new_constraint_name;

1
@ArturoHerrero เราสามารถเปลี่ยนชื่อข้อ จำกัด หลายอย่างพร้อมกันได้ไหมถ้าใช่ได้อย่างไร?
Erlan

1
@Erlan คุณสามารถรับรายการข้อ จำกัด ทั้งหมดผ่านแบบสอบถามเพื่อpg_catalogทำซ้ำผ่านLOOPและใช้แบบสอบถามแบบไดนามิกเพื่อเปลี่ยนชื่อ
Evgeny Nozdrev

2

เราพบว่าคีย์หลักมักล้าหลังชื่อตารางหลัก สคริปต์นี้ช่วยให้เราระบุและแก้ไขสิ่งที่มีปัญหา

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

สิ่งนี้จะค้นหาตารางทั้งหมดที่ชื่อคีย์หลักไม่ใช่รูปแบบ "เริ่มต้น" ( <tablename>_pkey) อีกต่อไปและสร้างสคริปต์เปลี่ยนชื่อสำหรับแต่ละรายการ

ขีด จำกัด 58 อักขระด้านบนในโค้ดด้านบนคือเพื่อกำหนดขนาดสูงสุดของชื่อข้อ จำกัด (63 ไบต์)

ตรวจสอบสิ่งที่ส่งคืนก่อนที่จะรัน หวังว่าจะเป็นประโยชน์สำหรับคนอื่น ๆ

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.