繁体   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