Postgresql

確保一列對複合主鍵的引用完整性的更好方法?

  • April 27, 2020

給定第一個表

CREATE TABLE table1 (
  column1 INTEGER,
  column2 TEXT,
  PRIMARY KEY (column1, column2));

SQL 是否有一種慣用的方式來約束column3第二個表

CREATE TABLE table2 (
   column3 INTEGER,
   column4 TEXT,
   PRIMARY KEY (column3, column4));

這樣column3column1?

我目前的解決方案是這個kludge:

CREATE TABLE table0 (
   column0 SERIAL PRIMARY KEY);

CREATE TABLE table1 (
  column1 INTEGER REFERENCES table0 (column0),
  column2 TEXT,
  PRIMARY KEY (column1, column2));

CREATE TABLE table2 (
   column3 INTEGER REFERENCES table0 (column0),
   column4 TEXT,
   PRIMARY KEY (column3, column4));

我學到了外鍵不能只引用複合主鍵的一個值的艱難方法:https ://stackoverflow.com/questions/3996774/foreign-key-relationship-with-composite-primary-keys-in-sql -伺服器-2005

如果這很重要,我正在使用 PostgreSQL。

編輯 (2020-04-26)

一條評論建議我添加一個具體的例子。

該表table1包含別名。多人可以被命名為“Jane Doe”,任何一個“Jane Doe”也可以被稱為“Jane Smith”和“Jane1990”。每個人都由 中的數字唯一標識column1。任一列都可以有重複項,但不允許重複行。

該表table2列出了 中的人出版的書籍table1,但table1可以包括從未出版過書籍的人,等等column3column1。再次不允許重複行。

在一些複雜的域(銀行、電信)中,名稱始終是實體而不是屬性。一個人可以擁有多個護照(姓名、國籍)我會為您提供的場景創建一個表結構;

create table author (
 id integer PRIMARY KEY,
 default_name_id integer -- you may / may not need this
 -- , any other author properties
);

-- just name aliases
create table author_name (
 id integer PRIMARY KEY,
 author_id integer NOT NULL REFERENCES author(id),
 name text not null,
 unique (author_id, name)
);

alter table author add FOREIGN KEY (default_name_id) REFERENCES author_name (id);

create table books(
 id integer PRIMARY KEY,
 book_name text
);

-- a book can be published by more than one author
create table book_publisher (
 book_id integer    REFERENCES books (id),
 author_id integer  REFERENCES author (id),
 PRIMARY KEY (book_id, author_id)
);

Postgresql 有數組類型。它也非常有用。但是大多數 ORM 不支持它。如果您可以在應用程式碼中使用數組,那麼它就更簡單了;

create table author (
 id integer PRIMARY KEY,
 name text[],  -- name[1] is default name.
 -- , any other author properties
);

引用自:https://dba.stackexchange.com/questions/265602