1

免責事項:私はデータベースを始めたばかりなので、おそらく非常に些細なことを見逃しています。

私は2つの(ある程度関連していますが、単一のテーブルになるには十分ではありません)テーブルを持っています:table_onetable_two


table_one重要な2つの列があります。

  1. nameタイプのvarchar(n)
  2. intersectsタイプのbit

table_two重要な列が1つあります。

  1. nameタイプのvarchar(n)

に存在するかどうかに応じて、自動的intersectsにどちら0かに設定したいのですが。1nametable_two

どういうわけか、この責任をデータベースエンジンに委任できますか?それが重要な場合、私は現在MySQLを使用しています。


編集:この種の密接な結合は、データベースを扱うときにも意味がありますか?

4

1 に答える 1

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

うまくいけば、これはこれらすべてにいくつかの光を当てます!

于 2009-08-11T02:17:42.740 に答える