sql >> データベース >  >> RDS >> PostgreSQL

2つの異なるテーブルの主キーを参照するPOSTGRESQL外部キー

    PostgreSQLでこれを行う方法は複数あります。個人的には、この方法が好きです。

    -- This table should contain all the columns common to both 
    -- audio books and printed books.
    create table books (
      isbn char(13) primary key,
      title varchar(100) not null,
      book_type char(1) not null default 'p'
        check(book_type in ('a', 'p')),
      -- This unique constraint lets the tables books_printed and books_audio 
      -- target the isbn *and* the type in a foreign key constraint.
      -- This prevents you from having an audio book in this table 
      -- linked to a printed book in another table.
      unique (isbn, book_type)
    );
    
    -- Columns unique to printed books.
    create table books_printed (
      isbn char(13) primary key references books (isbn),
      -- Allows only one value. This plus the FK constraint below guarantee
      -- that this row will relate to a printed book row, not an audio book
      -- row, in the table books. The table "books_audio" is similar.
      book_type char(1) default 'p'
        check (book_type = 'p'),
      foreign key (isbn, book_type) references books (isbn, book_type),
      other_columns_for_printed_books char(1) default '?'
    );
    
    -- Columns unique to audio books.
    create table books_audio (
      isbn char(13) primary key references books (isbn),
      book_type char(1) default 'a'
        check (book_type = 'a'),
      foreign key (isbn, book_type) references books (isbn, book_type),
      other_columns_for_audio_books char(1) default '?'
    );
    
    -- Authors are common to both audio and printed books, so the isbn here
    -- references the table of books.
    create table book_authors (
      isbn char(13) not null references books (isbn),
      author_id integer not null references authors (author_id), -- not shown
      primary key (isbn, author_id)
    );
    


    1. PostgreSQLとMySQLのクロスレプリケーションの概要

    2. Oracleにレコードが存在するかどうかを確認する最も効率的な方法は何ですか?

    3. SQLServerの動的ピボット列

    4. postgresqlでのROLLBACKイベントトリガー