限制一对多关系中的可能值

时间:2018-02-16 06:07:36

标签: sql postgresql

假设我有一张桌子:

    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_typesub_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对不存在。

设计表格可能更好的方法是什么?

2 个答案:

答案 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