Khóa ngoại nhiều màu không duy nhất


7

Tôi có một bảng "bình luận" mô hình cuộc hội thoại về một chủ đề, như thế này:

id serial  
topic_id integer  
parent_comment_id integer
body text

Vì vậy, mọi bình luận đều có một tham chiếu đến chủ đề của nó VÀ cuối cùng là bình luận chính của nó (nếu đó không phải là bình luận đầu tiên về chủ đề này).
Tôi muốn thêm một ràng buộc sẽ ngăn việc thêm các hàng có chủ đề / phụ huynh không khớp (ví dụ: bằng cách tham chiếu một chủ đề không có nhận xét bắt buộc hoặc ngược lại nhận xét tham chiếu chủ đề sai).
Điều này có thể không? Là một kích hoạt cần thiết?

(Đối với hồ sơ, tôi đã thử

ALTER TABLE comments ADD FOREIGN KEY (parent_comment_id, topic_id)
                 REFERENCES comments (id, topic_id)

nhưng nó phàn nàn rằng there is no unique constraint matching given keys for referenced table "comments")


khóa chính có tồn tại trên bảng 'ý kiến' không?
SQLRockstar

Vâng xin lỗi, đó là id
Joril

1
Hãy thử tạo chỉ mục duy nhất how_you_want_to_name_this_index trên các bình luận (id, topic_id); trước khi ban hành lệnh thay đổi bảng thêm khóa ngoại.
jp

Hoặc chỉ cần thêm dòng duy nhất (id, topic_id), trong phần "tạo bảng" của bạn để nhận xét.
jp

Câu trả lời:


4

Bạn cần thêm siêu khóa (chỉ mục / ràng buộc duy nhất) trên cả hai (id, topic_id). Điều này cung cấp cho bạn tính duy nhất "mục tiêu" để tạo khóa ngoại của bạn. Điều này hoạt động như một ràng buộc KIỂM TRA trong trường hợp này.

ALTER TABLE comments ADD 
    FOREIGN KEY (parent_comment_id, topic_id) REFERENCES comments (id, topic_id)

Lưu ý: id vẫn là khóa chính để bảo toàn mô hình. Ngay cả khi id là nối tiếp, sẽ là sai từ góc độ mô hình hóa để thay đổi PK thành (id, topic_id)


1
Điều đó đúng về mặt kỹ thuật, nhưng về mặt logic thì đây không phải là ràng buộc mới. Đưa ra khóa chính trên id, nó luôn được đáp ứng. Tức là nó chỉ là một khuyết tật của việc thực hiện DBMS.
bernd_k

@bernd_k: đây là lý do tại sao tôi nói "siêu chìa khóa". Nó cũng tách PK thực tế khỏi superkey / FK.
gbn

1

Thử

ALTER TABLE comments ADD FOREIGN KEY (parent_comment_id, topic_id)
    REFERENCES comments (id)

Nếu bạn muốn nó hoạt động:

ALTER TABLE comments ADD FOREIGN KEY (parent_comment_id, topic_id)
    REFERENCES comments (id, topic_id)

Sau đó, tôi tin rằng bạn cần thay đổi PK của mình trên cả cột id và topic_id.

Ngoài ra, tôi nghĩ rằng liên kết này giúp giải thích những gì bạn cần: http://www.postgresql.org/docs/8.1/static/ddl-constraint.html


1
Lệnh đầu tiên cho tôi number of referencing and referenced columns for foreign key disagree: / Tôi nghĩ rằng vấn đề với lệnh của tôi là có thể có nhiều hàng với chủ đề + chủ đề phù hợp
Joril

OK, bạn có thể thay đổi khóa chính để có hai cột không? sau đó lệnh ban đầu của bạn sẽ hoạt động, tôi tin.
SQLRockstar
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.