PostgreSQL: tên ràng buộc mặc định


85

Khi tạo bảng trong PostgreSQL, các tên ràng buộc mặc định sẽ được gán nếu không được cung cấp:

CREATE TABLE example (
    a integer,
    b integer,
    UNIQUE (a, b)
);

Nhưng việc sử dụng ALTER TABLEđể thêm một ràng buộc thì có vẻ như một cái tên là bắt buộc:

ALTER TABLE example ADD CONSTRAINT my_explicit_constraint_name UNIQUE (a, b);

Điều này đã gây ra một số mâu thuẫn đặt tên trên các dự án tôi đã làm việc và dẫn đến các câu hỏi sau:

  1. Có cách nào đơn giản để thêm một ràng buộc vào một bảng còn tồn tại với tên mà nó sẽ nhận được nếu được thêm vào trong quá trình tạo bảng không?

  2. Nếu không, có nên tránh hoàn toàn các tên mặc định để tránh sự mâu thuẫn không?


3
Tôi đặt nó thành một quy tắc để tránh các tên mặc định chỉ vì lý do này - bạn sẽ gặp phải trường hợp trong mỗi lần triển khai, các ràng buộc có các tên khác nhau.
Paul Tomblin

Câu trả lời:


35

Các nhãn hiệu là khá rõ ràng về vấn đề này ( " tableconstraint: Hình thức này cho biết thêm một ràng buộc mới vào một bảng bằng cách sử dụng cú pháp giống như CREATE TABLE. ")

Vì vậy, bạn có thể chỉ cần chạy:

Ví dụ ALTER TABLE ADD UNIQUE (a, b);

5
Ah! Tôi đã nhầm lẫn bao gồm cả CONSTRAINTlike ALTER TABLE example ADD CONSTRAINT UNIQUE (a, b);và nhận được lỗi. Cảm ơn bạn!
Ian Mackinnon

275

Các tên tiêu chuẩn cho các chỉ mục trong PostgreSQL là:

{tablename}_{columnname(s)}_{suffix}

trong đó hậu tố là một trong những thứ sau:

  • pkey cho một ràng buộc Khóa chính
  • key cho một ràng buộc Duy nhất
  • excl cho một ràng buộc Loại trừ
  • idx cho bất kỳ loại chỉ mục nào khác
  • fkey cho một khóa nước ngoài
  • check cho một ràng buộc Kiểm tra

Hậu tố tiêu chuẩn cho chuỗi là

  • seq cho tất cả các chuỗi

Bằng chứng về ràng buộc DUY NHẤT của bạn:

LƯU Ý: CREATE TABLE / UNIQUE sẽ tạo chỉ mục ngầm định "example_a_b_key" cho bảng "example"


10
Rất hữu ích, cảm ơn! Đáng nói thêm rằng các khóa ngoại sử dụng hậu tố fkeyvà các ràng buộc khóa ngoại nhiều cột dường như chỉ bao gồm tên cột đầu tiên.
Ian Mackinnon

1
@IanMackinnon, Đây phải là câu trả lời tốt nhất!
Marcio Mazzucato

Thông tin này là vàng! Bạn có thể xác nhận những điều này bằng cách chạy ví dụCREATE TABLE mytable (mycolumn numeric UNIQUE);
jmagnusson

6
Chính xác câu trả lời tôi đang tìm kiếm khi googling "ước index đặt tên postgresql"
Fancy John

1
@someone à, xin lỗi, tôi đoán ý tôi là phần cuối của Lệnh Tiện ích E.4.3.3. Đây là mục dấu đầu dòng cuối cùng trước E.4.3.4 Loại dữ liệu: "Sử dụng tên của tất cả các cột chính khi chọn tên ràng buộc mặc định cho khóa ngoại (Peter Eisentraut)"
Michael Hewson
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.