Cập nhật tên ràng buộc trong PostgreSQL


90

Có thể thay đổi tên ràng buộc trong Postgres không? Tôi đã thêm PK với:

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

Và tôi muốn đặt tên khác cho nó, để phù hợp với phần còn lại của hệ thống. Tôi có nên xóa ràng buộc PK hiện có và tạo một ràng buộc mới không? Hay có một cách 'mềm' nào để quản lý nó?

Cảm ơn!

Câu trả lời:


82

Đối với khóa chính, bạn có thể chỉ:

ALTER INDEX commerce_contractor_pkey RENAME TO whatever_new_name

Tuy nhiên, điều đó sẽ không hoạt động đối với các loại ràng buộc khác. Lựa chọn tốt nhất là bỏ cái cũ và tạo một cái mới. Hãy chắc chắn thực hiện nó trong một giao dịch, vì vậy hệ thống sẽ không tồn tại nếu không có nó trong quá trình xây dựng lại. (Và nếu bạn không thể làm điều đó trong một giao dịch, hãy đảm bảo tạo giao dịch mới trước , trước khi bỏ giao dịch cũ)


154

Để đổi tên một ràng buộc hiện có trong PostgreSQL 9.2 hoặc mới hơn , bạn có thể sử dụng ALTER TABLE :

ALTER TABLE name RENAME CONSTRAINT constraint_name TO new_constraint_name;

1
@ArturoHerrero chúng ta có thể đổi tên trên nhiều ràng buộc cùng một lúc không, nếu có, làm thế nào?
Erlan

1
@Erlan, bạn có thể lấy danh sách tất cả các ràng buộc thông qua truy vấn pg_catalog, lặp qua nó LOOPvà sử dụng truy vấn động để đổi tên.
Evgeny Nozdrev

1

Chúng tôi nhận thấy rằng các khóa chính thường bị tụt hậu so với tên bảng chính. Tập lệnh này đã giúp chúng tôi xác định và khắc phục những tập lệnh có vấn đề.

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

Thao tác này tìm tất cả các bảng mà tên khóa chính không còn là mẫu "mặc định" ( <tablename>_pkey) và tạo tập lệnh đổi tên cho mỗi bảng.

Giới hạn 58 ký tự ở trên trong đoạn mã trên là tính đến kích thước tối đa của tên ràng buộc (63byte).

Rõ ràng là ý thức kiểm tra những gì được trả về trước khi chạy nó. Hy vọng điều đó sẽ hữu ích cho những người khác.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.