Postgres: Làm thế nào để làm các phím tổng hợp?


111

Tôi không thể hiểu lỗi cú pháp khi tạo khóa tổng hợp. Nó có thể là một lỗi logic, bởi vì tôi đã thử nghiệm nhiều giống.

Làm cách nào để bạn tạo khóa tổng hợp trong Postgres?

CREATE TABLE tags
     (
              (question_id, tag_id) NOT NULL,
              question_id INTEGER NOT NULL,
              tag_id SERIAL NOT NULL,
              tag1 VARCHAR(20),
              tag2 VARCHAR(20),
              tag3 VARCHAR(20),
              PRIMARY KEY(question_id, tag_id),
              CONSTRAINT no_duplicate_tag UNIQUE (question_id, tag_id)
     );
    ERROR:  syntax error at or near "("
    LINE 3:               (question_id, tag_id) NOT NULL,
                          ^

Câu trả lời:


171

PRIMARY KEYĐặc điểm kỹ thuật phức hợp của bạn đã làm những gì bạn muốn. Bỏ qua dòng gây ra lỗi cú pháp cho bạn và bỏ qua dòng thừa CONSTRAINT(đã ngụ ý):

 CREATE TABLE tags
      (
               question_id INTEGER NOT NULL,
               tag_id SERIAL NOT NULL,
               tag1 VARCHAR(20),
               tag2 VARCHAR(20),
               tag3 VARCHAR(20),
               PRIMARY KEY(question_id, tag_id)
      );

NOTICE:  CREATE TABLE will create implicit sequence "tags_tag_id_seq" for serial column "tags.tag_id"
    NOTICE:  CREATE TABLE / PRIMARY KEY will create implicit index "tags_pkey" for table "tags"
    CREATE TABLE
    pg=> \d tags
                                         Table "public.tags"
       Column    |         Type          |                       Modifiers       
    -------------+-----------------------+-------------------------------------------------------
     question_id | integer               | not null
     tag_id      | integer               | not null default nextval('tags_tag_id_seq'::regclass)
     tag1        | character varying(20) |
     tag2        | character varying(20) |
     tag3        | character varying(20) |
    Indexes:
        "tags_pkey" PRIMARY KEY, btree (question_id, tag_id)

Bạn sẽ triển khai một quy tắc tương phản như "CONSTRAINT no_duplicate_refences THAM KHẢO DUY NHẤT TỪ tag_id ĐẾN (tag1, tag2, tag3)" như thế nào?
Léo Léopold Hertz 준영

4
@Masi, tôi không nghĩ rằng tôi hiểu đủ về những gì bạn đang cố gắng tạo mô hình ở đây, và thành thật mà nói, các cột tag1thông qua tag3gợi ý cho tôi rằng bạn có thể phải cải tiến thiết kế hơn nữa. Có lẽ một câu hỏi riêng, với mô tả bằng ngôn ngữ tự nhiên về mô hình của bạn và một vài bản ghi ví dụ, sẽ hữu ích.
ăn trộm

18

Lỗi bạn đang gặp phải ở dòng 3. tức là nó không ở

CONSTRAINT no_duplicate_tag UNIQUE (question_id, tag_id)

nhưng trước đó:

CREATE TABLE tags
     (
              (question_id, tag_id) NOT NULL,

Định nghĩa bảng chính xác giống như pilcrow cho thấy.

Và nếu bạn muốn thêm duy nhất trên tag1, tag2, tag3 (nghe có vẻ rất đáng ngờ), thì cú pháp là:

CREATE TABLE tags (
    question_id INTEGER NOT NULL,
    tag_id SERIAL NOT NULL,
    tag1 VARCHAR(20),
    tag2 VARCHAR(20),
    tag3 VARCHAR(20),
    PRIMARY KEY(question_id, tag_id),
    UNIQUE (tag1, tag2, tag3)
);

hoặc, nếu bạn muốn đặt tên cho ràng buộc theo ý muốn của mình:

CREATE TABLE tags (
    question_id INTEGER NOT NULL,
    tag_id SERIAL NOT NULL,
    tag1 VARCHAR(20),
    tag2 VARCHAR(20),
    tag3 VARCHAR(20),
    PRIMARY KEY(question_id, tag_id),
    CONSTRAINT some_name UNIQUE (tag1, tag2, tag3)
);
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.