2015-11-17 2 views
0

У меня есть вопрос о создании правила вставки или триггера для таблицы [t_1] в PostgreSQLPostgresql вставка правило/триггер

В таблице имеет четыре колонки: c1, c2, c3, c4, ID (уникальный) При новый рекорд попытаться вставить в таблицу существуют следующие правила:

  1. Если идентификатор не дублируется, а затем сделать нормальную вставку с новой записью
  2. Если идентификатор существует: проверьте c1, c2, c3 и NEW. c1, NEW.c2, NEW.c3; если c1 или c2 или c3 не являются нулевыми, выполните обновление записи и не перезаписывайте старую запись новой записью.

Например

c1 (не равно нулю), с2 (нуль), c3 (не равно нулю), с4 (нуль)

+

nC1 (не равно нулю), Nc2 (не равно нулю), nc3 (нуль), nc4 (нуль)

Результат

c1, ПС2, c3, c4

  1. Если id существует: если новый c4 не является нулевым, проверьте старые c1, c2, c3, если какой-либо из старых c1, c2, c3 не равен null, тогда НЕ НИЧЕГО (не вставки или обновления)

Вот мой код в настоящее время: (до сих пор не имеют решения для 3-го состояния)

CREATE RULE "t_1_on_duplicate_ignore" AS ON INSERT TO "t_1" 
    WHERE EXISTS(SELECT 1 FROM t_1 
    WHERE (id)=(NEW.id) 
DO INSTEAD 
(
    UPDATE t_1 SET 
    c1 = CASE 
    WHEN c1 IS NOT NULL 
    THEN c1 
    ELSE NEW.c1 
    END, 
    c2 = CASE 
    WHEN c2 IS NOT NULL 
    THEN c2 
    ELSE NEW.c2 
    END, 
    c3 = CASE 
    WHEN c3 IS NOT NULL 
    THEN c3 
    ELSE NEW.c3 
    END 
    WHERE id = NEW.id; 
) 

ответ

0

Привет, ребята, я думаю, что я решил эту проблему (по крайней мере, его работы для меня) со следующими командами:

 CREATE RULE "t_1_on_duplicate_ignore" AS ON INSERT TO "t_1" 
     WHERE EXISTS(SELECT 1 FROM t_1 
     WHERE (id)=(NEW.id)) 
    DO INSTEAD 
    (
     UPDATE t_1 SET 
      c1 = CASE 
      WHEN (c1 IS NOT NULL AND c4 IS NOT NULL) OR (c4 IS NULL AND c1 IS NOT NULL) OR (c4 IS NULL AND NEW.c4 IS NOT NULL) 
      THEN c1 
      ELSE NEW.c1 
      END, 
      c2 = CASE 
      WHEN (c2 IS NOT NULL AND c4 IS NOT NULL) OR (c4 IS NULL AND c2 IS NOT NULL) OR (c4 IS NULL AND NEW.c4 IS NOT NULL) 
      THEN c2 
      ELSE NEW.c2 
      END, 
      c3 = CASE 
      WHEN (c3 IS NOT NULL AND c4 IS NOT NULL) OR (c4 IS NULL AND c3 IS NOT NULL) OR (c4 IS NULL AND NEW.c4 IS NOT NULL) 
      THEN c3 
      ELSE NEW.c3 
      END, 
      c4 = c4 
     WHERE id = NEW.id; 
    ) 

Любой бет э-решений?

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