免责声明:我刚开始使用数据库,所以我可能会遗漏一些非常微不足道的东西。
我有两个(有些相关,但不足以成为单个表)表:table_one
和table_two
。
table_one
有两列重要内容:
name
的varchar(n)
类型intersects
bit
醇>
table_two
有一列重要意义:
name
varchar(n)
醇>
我希望自动将intersects
设置为0
或1
,具体取决于name
中是否存在table_two
我可以以某种方式将此职责委托给数据库引擎吗?我现在正在使用MySQL,如果这很重要的话。
编辑:在处理数据库时,这种紧密耦合是否有意义?
答案 0 :(得分:1)
ANSI SQL:
update table_one
set intersects =
case when
(select count(*) from table_two where name = table_one.name) > 0
then 1
else 0 end
MySQL加入:
update table_one t1
left join table_two t2 on
t1.name = t2.name
set t1.intersects = case when t2.name is not null then 1 else 0 end
您可以将此查询放入trigger
以使intersects
保持最新状态:
create trigger intersections after insert for each row
begin
update table_one t1
left join table_two t2 on
t1.name = t2.name
set t1.intersects = case when t2.name is not null then 1 else 0 end
where t1.name = new.name
end
现在,对于设计讨论:
intersects
列非常棒,但您可能会遇到不同步的问题。您可以执行的操作是在exists
中使用select
函数时调用此函数:
select
*
from
table_one t1
where
exists (select 1 from table_two t2 where t2.name = t1.name)
您也可以使用not exists
查找那些不相交的内容。
此外,您还可以使用left join
撤回这两种情况:
select
*
from
table_one t1
left join table_two t2 on
t1.name = t2.name
t2.name
为null
的任何地方,您没有交叉点。什么都不是,你这样做。当然,如果unique
上没有name
约束,则会产生重复的行。
希望这能够解释所有这些!