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

How to make sure that a foreign key is not set in another table in SQL?

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

我有三个table:

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
);

电影 table 中的 pid,例如 moviecoproducer table 中的 pid 和 mid 由适当的外键引用。此外,moviecoproducer table 中的 mid 和 pid 值的组合是唯一的。

我现在必须确保没有制片人在电影 table 中被引用为(主要)制片人,并且在同一部电影的 moviecoproducer 中间 table 中被引用为联合制片人。我创建了一个触发器来执行此操作,但现在我问自己,如果我重新设计 table 结构,是否会有更简单的解决方案(例如检查约束)。

难道我只需要触发器是因为设计不好,因为我不知道如何以 different/better 的方式做到这一点。

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

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这将使制片人不再为特定电影出现多次)

我相信这会解决您遇到的问题并且不需要触发器

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

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 将保留“main”或“co”值。

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

一个额外的好处:如果在未来的某个时候你想引入类似“初级联合制作人”的东西,你就不需要改变你的架构。

此设计未完全规范化:缺少 状态 table。看看有没有兴趣加进去。