Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Триггер вида insert on duplicate IF CONDITION update / 4 сообщений из 4, страница 1 из 1
09.08.2013, 14:05:29
    #38360910
BaurzhanS
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Триггер вида insert on duplicate IF CONDITION update
Всем привет! Написал триггер, который при вставке в одну таблицу Т1, вставляет новые данные в другую таблицу Т2. При этом, если в Т2 нет записи с соответствующим ключом, просто вставляем, если есть, обновляем.
Код: sql
1.
insert on duplicate update

- скажете Вы и будете правы. Но мне надо так - если нет записи, вставляем, а потом если выполнится некое условие , обновляем. Что-то вроде
Код: sql
1.
insert on duplicate IF CONDITION update

.

Вот моя попытка, ниже напишу почему она неправильная:

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
DELIMITER $$

USE `smdpo`$$

CREATE
DEFINER=`root`@`localhost`
TRIGGER `db`.`updateCurrentState`
AFTER INSERT ON `db`.`records`
FOR EACH ROW
begin
-- IF(NEW.timestamp>db.currentState.timestamp) THEN  
 
   INSERT INTO db.currentState (id,timestamp)
   VALUES (NEW.deviceID,NEW.timestamp)
   ON DUPLICATE KEY UPDATE 
   db.currentState.timestamp = NEW.timestamp;

-- END IF;
end$$



Как видите, я поставил условие, но мне надо бы поставить его перед UPDATE. А у меня выходит, что я даже перед вставкой проверяю условие
Код: sql
1.
IF(NEW.timestamp>db.currentState.timestamp) 

. Но ведь таблица db.currentState может быть пустой, поэтому выражение db.currentState.timestamp не имеет смысла. Мне надо что-то вроде
Код: sql
1.
2.
ON DUPLICATE KEY  IF(NEW.timestamp>db.currentState.timestamp) UPDATE 
   db.currentState.timestamp = NEW.timestamp;
...
Рейтинг: 0 / 0
09.08.2013, 14:16:59
    #38360930
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Триггер вида insert on duplicate IF CONDITION update
типа
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
begin
   INSERT INTO db.currentState (id,timestamp)
   VALUES (NEW.deviceID,NEW.timestamp)
   ON DUPLICATE KEY UPDATE db.currentState.timestamp = CASE 
        WHEN NEW.timestamp>db.currentState.timestamp 
        THEN NEW.timestamp
        ELSE db.currentState.timestamp
        END;
end
...
Рейтинг: 0 / 0
09.08.2013, 14:25:55
    #38360962
miksoft
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Триггер вида insert on duplicate IF CONDITION update
Код: sql
1.
2.
3.
INSERT INTO db.currentState (id,timestamp)
  VALUES (NEW.deviceID,NEW.timestamp)
  ON DUPLICATE KEY UPDATE db.currentState.timestamp = GREATEST(db.currentState.timestamp, NEW.timestamp)
...
Рейтинг: 0 / 0
09.08.2013, 15:25:43
    #38361098
BaurzhanS
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Триггер вида insert on duplicate IF CONDITION update
miksoft, Akina

Спасибо за ответы! Всё работает.
...
Рейтинг: 0 / 0
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Триггер вида insert on duplicate IF CONDITION update / 4 сообщений из 4, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]