如何确保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。看看有没有兴趣加进去。
我正在使用 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。看看有没有兴趣加进去。