簡體   English   中英

如何創建檢查以確保另一個表中存在值?

[英]How do I create a check to make sure a value exists in another table?

現在,我有兩個表,一個表包含一個復合主鍵,另一個表引用了主鍵的值之一,但是是ProductMapping之間的一對多關系。 以下是設置的想法:

CREATE TABLE dev."Product"
(
  "Id" serial NOT NULL,
  "ShortCode" character(6),
  CONSTRAINT "ProductPK" PRIMARY KEY ("Id")
)

CREATE TABLE dev."Mapping"
(
  "LookupId" integer NOT NULL,
  "ShortCode" character(6) NOT NULL,
  CONSTRAINT "MappingPK" PRIMARY KEY ("LookupId", "ShortCode")
)

由於ShortCode是作為六個字符串顯示給用戶的,我不想讓另一個表具有適當的外鍵引用,但是PostgreSQL不允許用當前的設計創建一個外鍵。 這樣,如何創建檢查以檢查“ Mapping表中的短代碼以確保其存在?

根據您的要求和Postgres的版本,建議使用TRIGGERNOT VALID CHECK約束

我們剛剛在dba.SE上的相關問題中深入討論了此問題:

如果我對您的理解正確,則需要在“產品”。“ ShortCode”上使用UNIQUE約束。 當然也應該將其聲明為NOT NULL。

CREATE TABLE dev."Product"
(
  "Id" serial NOT NULL,
  "ShortCode" character(6) NOT NULL UNIQUE,
  CONSTRAINT "ProductPK" PRIMARY KEY ("Id")
);

CREATE TABLE dev."Mapping"
(
  "LookupId" integer NOT NULL,
  "ShortCode" character(6) NOT NULL REFERENCES dev."Product" ("ShortCode"),
  CONSTRAINT "MappingPK" PRIMARY KEY ("LookupId", "ShortCode")
);

您原始的“產品”表將允許此INSERT語句成功執行,但不會成功。

insert into dev."Product" ("ShortCode") values
(NULL), (NULL), ('ABC'), ('ABC'), ('ABC');

這樣的數據幾乎沒有用。

select * from dev."Product"
id  ShortCode
--
1   
2   
3   ABC   
4   ABC   
5   ABC

暫無
暫無

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

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