2009-08-11 5 views
1

免責事項:私はデータベースを使い始めたばかりです。SQLでN値を同期させる

私は2つ(多少関連していますが、1つのテーブルになるには不十分です)のテーブル:table_onetable_twoを持っています。


table_one意義の二つの列があります

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

table_twoが意義の一つの列を有しています私は自動的にをたいタイプvarchar(n)


  1. namenametable_two中に存在するかどうかに応じ0または1いずれかにintersectsを設定。

    この責任を何らかの形でデータベースエンジンに委任できますか?私は現在MySQLを使用しています。


    EDIT:データベースを扱うとき近いカップリングのこの種のも理にかなっていますか?

答えて

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 

あなたがintersectsを保つためにtriggerにこのクエリを置くことができる最新:今

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の列は素晴らしく、すべてが同期していない問題にぶつかります。

select 
    * 
from 
    table_one t1 
where 
    exists (select 1 from table_two t2 where t2.name = t1.name) 

あなたにも、交差しないものを見つけるためにnot existsを使用することができます。何ができることは、これを呼び出すときに、あなたのselectexists機能を使用しています。

また、あなたはまた、バック両方のケースを引っ張ってleft joinを使用することができます。

t2.namenullある
select 
    * 
from 
    table_one t1 
    left join table_two t2 on 
     t1.name = t2.name 

何でも、あなたが交差点を持っていません。どこにいても、あなたはしません。もちろん、nameuniqueという制約がない場合は、重複する行が生成される可能性があります。

これは、このすべての上にいくつかの光を願って!

+0

ありがとう、私はこのクエリを毎回table_oneの変更が実行する必要がありますか?テーブルの変更が発生したときに呼び出されるソートのコールバックを登録する方法はありますか? –

+0

コールバックでは、自分のアプリケーションではなく、データベース自体を意味します。 –

+0

素晴らしい!再度、感謝します! –

関連する問題