如何确保SQL中的另一个表中没有设置外键?

时间:2016-07-13 21:10:10

标签: sql oracle triggers constraints oracle12c

我正在使用Oracle Database 12c企业版。

我有三张桌子:

table producer (
  pid int primary key,
  name varchar2(50)
);

table movie (
  mid int primary key,
  pid varchar2(50),
  name varchar2(50)
);

table moviecoproducers (
  mid int,
  pid int
);

电影表格中的pid(例如moviecoproducers表中的pid和mid)由适当的外键引用。此外,moviecoproducers表中mid和pid值的组合是唯一的。

我现在必须确保没有生产者被引用为电影表中的(主)生产者,并且作为同一电影的moviecoproducer中间表中的共同生产者。我创建了一个触发器,但是现在我问自己,如果我重新设计我的表结构,是否会有更多的eazy解决方案(例如检查约束)。

我只需要一个触发因为设计不好,因为我不知道如何以不同/更好的方式做到这一点。

2 个答案:

答案 0 :(得分:1)

创建一个典型的3表多对多结构。

table producer (
  pid int primary key,
  name varchar2(50)
);

table movie (
  mid int primary key,
  name varchar2(50)
);

table movieproducer (
  mid int,
  pid int,
  status varchar2(10)
)

status将保留&#34; 主要&#34;或&#34; co <​​/ em>&#34;值。

现在,您可以使用表约束和无触发器来管理限制。

额外的好处:如果在将来的某个时间你想要介绍类似&#34; 初级合作制片人&#34;你不需要改变你的架构。

此设计未完全规范化:缺少状态表。看看你是否有兴趣加入它。

答案 1 :(得分:0)

好的,不确定varchar pid代表什么..所以让我们从一个稍微不那么令人困惑的表结构开始......

table producer ( producer_id int primary key,
                 producer_name varchar2(50) )

table movie ( movie_id int primary key,
              movie_data varchar2(50)
              movie_name varchar2(50) )

table movieproducers ( movie_id int*#
                       producer_type int*
                       producer_id int# )

这里我们在MovieProducers中有2个共享密钥(或唯一索引)。首先是movie_id和producer_type,其中1将是主要生产者,1以上的任何其他数字将是防止重复生成者类型的共同生产者 - 而movie_id和producer_id将消除生产者对特定电影多次出现)< / p>

我相信这样可以解决您所遇到的问题而不需要触发器