如何创建检查以确保另一个表中存在值?

时间:2014-09-04 17:59:54

标签: postgresql check-constraints

现在我有两个表,一个包含复合主键,另一个表引用主键的一个值,但是Product和{{1}之间的一对多关系}。以下是设置的概念:

Mapping

由于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") ) 作为六个字符的字符串显示给用户,我不希望另一个表具有正确的外键引用,但尝试使用当前设计创建一个{{3} }}。因此,如何创建一个检查,以便检查ShortCode表中的短代码以确保它存在?

2 个答案:

答案 0 :(得分:0)

根据您的要求和Postgres版本的细则,我建议使用TRIGGERNOT VALID CHECK constraint

我们刚才在dba.SE的相关问题中深入讨论了这个问题:

答案 1 :(得分:-1)

如果我理解正确,您需要在"产品"。" 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")
);

您的原创"产品" table将允许此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