现在我有两个表,一个包含复合主键,另一个表引用主键的一个值,但是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
表中的短代码以确保它存在?
答案 0 :(得分:0)
根据您的要求和Postgres版本的细则,我建议使用TRIGGER
或NOT 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