在SQL中跨表同步N个值

时间:2009-08-11 02:13:51

标签: sql mysql field synchronize

免责声明:我刚开始使用数据库,所以我可能会遗漏一些非常微不足道的东西。

我有两个(有些相关,但不足以成为单个表)表:table_onetable_two


table_one有两列重要内容:

    类型name
  1. varchar(n) 类型intersects
  2. bit

    table_two有一列重要意义:

      类型name
    1. varchar(n)

      我希望自动intersects设置为01,具体取决于name中是否存在table_two

      我可以以某种方式将此职责委托给数据库引擎吗?我现在正在使用MySQL,如果这很重要的话。


      编辑:在处理数据库时,这种紧密耦合是否有意义?

1 个答案:

答案 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.namenull的任何地方,您没有交叉点。什么都不是,你这样做。当然,如果unique上没有name约束,则会产生重复的行。

希望这能够解释所有这些!