假设我有一张桌子:
main_type => Columns : id(pk), name
sub_type => columns : id(pk), sub_type_name
一种主要类型可以包含多个sub_type
eg. (main_type -> sub_type) => a ->b, a->c, a -> d, b -> b, b-> c, c -> x, c->y
现在我想要另一个表来引用这两个表,但是它应该只允许我在上面定义的main_type
和sub_type
中可能的对。
所以这个表应该是这样的:
another_table : columns => id,other_column,some_other_column,main_type,sub_type,desc
所以,在另一个表中,如果我尝试输入如下值:
1,'other value','some other value', 'a', 'y','description' =>
不应该允许这样做,因为a->y
对不存在。
设计表格可能更好的方法是什么?
答案 0 :(得分:0)
您可以创建组合外键,但必须首先为引用列创建唯一约束:
ALTER TABLE type_table
ADD CONSTRAINT main_type_sub_type_unique_cnstr
UNIQUE(main_type, sub_tpye);
ALTER TABLE anther_table
ADD CONSTRAINT main_type_sub_type_fk
FOREIGN KEY (main_type, sub_type) REFERENCES type_table(main_type, sub_tpye);
docs并未引用唯一约束,但如果它遗失,您将收到类似
的错误错误:没有唯一约束匹配给定引用表的键#34; type_table"
答案 1 :(得分:0)
首先将表 sub_type 和 main_type 重新设计为一个表ieTYpes_ALL 并在它们之间建立复合的主键和外键关系。
检查代码。
Create Table TYpes_ALL
( Id SERIAL,
main_type varchar(1) ,
sub_type varchar(1),
primary key (main_type,sub_type)
)\\
insert into TYpes_ALL (main_type,sub_type )values
('a','b'),('a','c'),('a','d'),('b','b'),('b','c'),('c','x'),('c','y')\\
Create table another_table
( ID int ,
other_column varchar(50),
some_other_column varchar(50),
main_type varchar(1) ,
sub_type varchar(1),
descp varchar(50),
FOREIGN KEY (main_type,sub_type) REFERENCES TYpes_ALL(main_type,sub_type)
)\\
insert into another_table values
(1,'other value','some other value', 'a', 'y','description')
现在,在记录错误记录时,您将收到错误:
23503:在表格上插入或更新" another_table"违反外键约束" another_table_main_type_fkey"
检查示例Demo here