2014-02-04 7 views
0

У меня есть три таблицы: Таблица 1 (A, B), Таблица 2 (C, D) и Таблица 3 (A, B, C, D). Таблица 3 содержит декартово произведение таблиц 1 и табл. 2.Как обновить таблицу продуктов

Мне нужно сделать необходимые триггеры, чтобы всякий раз, когда я вставляю, обновляю или удаляю любые строки из Таблицы 1 или Таблицы 2, таблица 3 обновляется соответствующим образом, так что она остается декартовым произведением Таблицы 1 и Таблицы2.

Я не могу найти разумный способ сделать это, и я был бы признателен за любые данные. Я использую PostgreSQL.

EDIT: Это из прошлого экзамена, поэтому альтернативные решения (например, создание таблицы 3 в представлении) недействительны.

+1

Переверните Table3 в удобное для вас решение? – Mathmagician

+0

Нет, это не так. См. Edit – user3146897

ответ

0

Почему бы просто не взглянуть на это?

CREATE VIEW Table3 AS SELECT A, B, C, D FROM Table1, Table2; 

Таким образом, он будет автоматически пребывание в синхронизации.

+0

Это не будет * автоматически * оставаться в синхронизации. Вам необходимо вызвать 'REFRESH MATERIALIZED VIEW' вручную. –

+0

@a_horse_with_no_name OK не знал этого - я предположил, что он обновлен автоматически, как это делает Oracle. –

+0

Это было бы логичным решением, но это вопрос из прошедшего экзамена, поэтому я должен сделать это, как указано – user3146897

0

Я бы предложил использовать обычный просмотр в текущих версиях postgres, материализованные представления в настоящее время нуждаются в полной перезагрузке после обновления базовой таблицы. Вероятно, будущие версии будут поддерживать инкрементные обновления, но полная перезагрузка - не очень полезная функция, потому что она так же тривиальна, как INSERT от SELECT. Можно реализовать инкрементные материализованные представления с помощью триггеров, но я не думаю, что это тоже хорошая идея, потому что это будет очень сложно (вам нужно будет сохранить специальные таблицы для хранения журнала изменений)

0

Вам нужно будет отсортировать из синтаксиса, но логика не слишком ужасна:

  • на INSERT в Table1 (новые значения new_A, new_B), вам нужна ВСТАВКА, как это в теле триггера:

    INSERT INTO Table3 SELECT new_A, new_B, Table2.C, Table2.D FROM Table2 
    
  • Симметричны, на INSERT в Table2 (новые значения new_C, new_D), вам нужен Вкладыш, как это в теле триггера:

    INSERT INTO Table3 SELECT Table1.A, Table1.B, new_C, new_D FROM Table1 
    
  • На УДАЛИТЬ из Table1 (старых значений old_A, old_B), вам нужен DELETE, как это в теле триггера:

    DELETE FROM Table3 WHERE Table3.A = old_A AND Table3.B = old_B 
    
  • и симметрично, на УДАЛИТЬ из Table2 (старых значений old_C, old_D), вам нужно УДАЛИТЬ, как это в теле триггера:

    DELETE FROM Table3 WHERE Table3.C = old_C AND Table3.D = old_D 
    
  • На UPDATE, вы можете отслеживать старые и новые значения, и выполнить DELETE и затем комбинацию ВСТАВИТЬ как и выше. Возможно, вы сможете «оптимизировать», посмотрев, изменилось ли в таблице 1 столбец A или столбец B или оба, но это, вероятно, не стоит усилий.

Я забираю его обратно; логика ужасна. Это не особенно сложно, но идея поддержания Table3, как это, должна заставить ваш скин сканировать.

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