2009-08-11 4 views
1

Отказ от ответственности: Я только начинал с баз данных, поэтому, вероятно, я пропустил что-то чрезвычайно тривиальное.Синхронизация значений N во всех таблицах в SQL

У меня есть два (несколько связанных, но недостаточно одного стола): table_one и table_two.


table_one имеет две колонки значения:

  1. name типа varchar(n)
  2. intersects типа bit

table_two имеет один столбец значение:

  1. name типа varchar(n)

Я хотел бы автоматически установитьintersects либо 0 или 1 в зависимости от того name присутствует в table_two.

Могу ли я как-то делегировать эту ответственность движку базы данных? В настоящее время я использую 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 

Вы можете поместить этот запрос в 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.

Надеюсь, это пролить свет на все это!

+0

Спасибо Эрик, должен ли я выполнять этот запрос каждый раз, когда есть изменение в table_one? Есть ли способ зарегистрировать обратный вызов видов, который вызывается при изменении таблицы? – 2009-08-11 02:19:33

+0

Обратный вызов, я не имею в виду в своем приложении, я имею в виду в самой базе данных. – 2009-08-11 02:20:22

+0

Фантастический! Еще раз спасибо! – 2009-08-11 02:21:58

Смежные вопросы