簡體   English   中英

對多個表的唯一約束

[英]Unique constraint over multiple tables

假設我們有這些表:

CREATE TABLE A (
    id SERIAL NOT NULL PRIMARY KEY
);
CREATE TABLE B (
    id SERIAL NOT NULL PRIMARY KEY
);
CREATE TABLE Parent (
    id SERIAL NOT NULL PRIMARY KEY,
    aId INTEGER NOT NULL REFERENCES A (id),
    bId INTEGER NOT NULL REFERENCES B (id),
    UNIQUE(aId, bId)
);
CREATE TABLE Child (
    parentId INTEGER NOT NULL REFERENCES Parent (id),
    createdOn TIMESTAMP NOT NULL
);

是否可以在Child上創建一個唯一約束,以便對於Child中的所有行至多引用一個具有某些aId值的Parent 換句話說,我可以創建一個唯一約束,以便上述表的連接不會有重復aId嗎? 我不認為——我能找到的每個數據庫的語法似乎都與每個約束綁定到一個表——但這可能是我缺乏想象力。 (當然,去規范化以在Child上包含aId是一種解決方案。)

您可以嘗試以下方法。 您必須在 Parent 中的(id, aId)上創建一個冗余的 UNIQUE 約束(SQL 非常愚蠢,不是嗎?)。

CREATE TABLE Child
(parentId INTEGER NOT NULL,
 aId INTEGER NOT NULL UNIQUE,
FOREIGN KEY (parentId,aId) REFERENCES Parent (id,aId),
createdOn TIMESTAMP NOT NULL);

可能更好的解決方案是從 Child 表中完全刪除 parentId,添加bId並僅基於(aId, bId)引用 Parent 表:

CREATE TABLE Child
(aId INTEGER NOT NULL UNIQUE,
 bId INTEGER NOT NULL,
FOREIGN KEY (aId,bId) REFERENCES Parent (aId,bId),
createdOn TIMESTAMP NOT NULL);

你有什么理由不能這樣做嗎?

執行此操作的正確方法是完全取消Child表並將createdOn列放在Parent表中,而不使用NOT NULL約束。 您所說的只是一個Parent條目可以有零個或一個(但不是更多) createdOn值。 你不需要一個單獨的表。 這樣做並不容易或不明顯這一事實部分地證明了我的觀點。 ;-) SQL 通常會這樣。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM