2009-08-11 3 views
1

Haftungsausschluss: Ich habe gerade mit Datenbanken begonnen, also vermisse ich wahrscheinlich etwas extrem Triviales.Synchronisieren von N-Werten Accross-Tabellen in SQL

Ich habe zwei (etwas verwandte, aber nicht genug, um eine einzige Tabelle zu sein) Tabellen: table_one und table_two.


table_one hat zwei Spalten von Bedeutung:

  1. name vom Typ varchar(n)
  2. intersects vom Typ bit

table_two hat eine Spalte von Bedeutung:

  1. name vom Typ varchar(n)

Ich möchte automatisch eingestelltintersects entweder 01 oder je nachdem, ob in nametable_two vorhanden ist.

Kann ich diese Verantwortung irgendwie an die Datenbank-Engine delegieren? Ich verwende derzeit MySQL, wenn das wichtig ist.


EDIT: Enthält diese Art von close-Kopplung auch Sinn machen, wenn sie mit Datenbanken zu tun?

Antwort

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 Join:

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 

Sie diese Abfrage in eine trigger setzen können intersects up-to-date zu halten:

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 

Jetzt, für die Design Diskussion:

Eine intersects Spalte ist großartig und alles, aber Sie können auf das Problem stoßen, wo es nicht mehr synchron ist. Was können Sie tun, ist eine exists Funktion in Ihrem select verwenden, wenn dieser Aufruf:

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

Sie können not exists verwenden diejenigen zu finden, die, wie auch nicht schneiden.

Darüber hinaus können Sie auch eine left join verwenden beide Fälle zurück zu ziehen:

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

Alles, wo t2.name ist null, Sie nicht über eine Kreuzung haben. Alles, wo es nicht ist, tust du.Dies kann natürlich doppelte Zeilen erzeugen, wenn Sie keine unique Einschränkung auf name haben.

Hoffentlich bringt dies Licht in all das!

+0

Danke Eric, müsste ich diese Abfrage jedes Mal ausführen, wenn es eine Änderung an table_one gibt? Gibt es eine Möglichkeit, einen Rückruf von Arten zu registrieren, der aufgerufen wird, wenn eine Tabellenänderung auftritt? –

+0

per Rückruf, ich meine nicht in meiner Anwendung, ich meine in der Datenbank selbst. –

+0

Fantastisch! Danke noch einmal! –

Verwandte Themen