SQLinfo.ru - Все о MySQL

Форум пользователей MySQL

Задавайте вопросы, мы ответим

Вы не зашли.

#1 07.11.2015 16:03:16

Kim
Участник
Зарегистрирован: 31.01.2015
Сообщений: 16

Триггер вставки перед обновлением

Есть пустая таблица:

CREATE TABLE `test_table` (
  `id` mediumint(8) unsigned NOT NULL DEFAULT '0',
  `time` mediumint(8) unsigned NOT NULL DEFAULT '0',
  `type` tinyint(4) NOT NULL,
  `field` varbinary(10) NOT NULL,
  `data` varbinary(255) NOT NULL DEFAULT '',
  PRIMARY KEY (`id`,`time`,`type`,`field`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1;

Поскольку команды SET в MySQL нет, был составлен такой триггер:

CREATE TRIGGER `test_trig` BEFORE UPDATE ON `test_table` FOR EACH ROW BEGIN
   INSERT IGNORE INTO `test_table` (`id`,`time`,`type`,`field`) VALUES (NEW.id, NEW.time, NEW.type, NEW.field);
END;

Соответственно чтобы запрос UPDATE стал работать как SET в NoSQL базах. Но не работает... Вопросы:
1. Интересует принципиальная возможность реализовать автоматическую вставку строки перед UPDATE, если подходящая для обновления строка отсутствует. Или, проще говоря, чтобы перед UPDATE еще добавлялся INSERT IGNORE с теми же значениями первичного ключа.
2. Возможно в новых версиях MySQL уже реализован аналог NoSQL команды SET?

Неактивен

 

#2 07.11.2015 16:27:34

rgbeast
Администратор
MySQL Authorized Developer and DBA
Откуда: Москва
Зарегистрирован: 21.01.2007
Сообщений: 3880

Re: Триггер вставки перед обновлением

Вариант с триггером не работоспособен сразу по двум причинам:
1. триггер сработает только если update происходит, то есть только если запись есть
2. в триггере нельзя менять ту же таблицу

Используйте

INSERT ON DUPLICATE KEY UPDATE

http://dev.mysql.com/doc/refman/5.7/en/ … icate.html

Неактивен

 

#3 07.11.2015 16:33:29

Kim
Участник
Зарегистрирован: 31.01.2015
Сообщений: 16

Re: Триггер вставки перед обновлением

Спасибо за ответ. ON DUPLICATE KEY UPDATE неудобен, т.к., на сколько я понял, требует дублирования значения.
Например на такой схеме:

CREATE TABLE `test_table` (
  `id` mediumint(8) unsigned NOT NULL DEFAULT '33',
  `time` mediumint(8) unsigned NOT NULL DEFAULT '0',
  `type` tinyint(4) NOT NULL,
  `field` varbinary(30) NOT NULL,
  `aaa` mediumint(9) NOT NULL,
  PRIMARY KEY (`id`,`time`,`type`,`field`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1;

Запрос:

INSERT INTO `test_table` (`aaa`, `id`, `time`, `type`, `field`) VALUES(`aaa`+99, 10, 2, 3, 'abc') ON DUPLICATE KEY UPDATE `aaa`=VALUES(aaa);

не работает. Происходит вставка строки со значением в поле aaa равным 99, что для моей задачи корректно. Но при повторном выполнении запроса значение не меняется на 198.

Неактивен

 

#4 07.11.2015 17:21:23

rgbeast
Администратор
MySQL Authorized Developer and DBA
Откуда: Москва
Зарегистрирован: 21.01.2007
Сообщений: 3880

Re: Триггер вставки перед обновлением

INSERT INTO `test_table` (`aaa`, `id`, `time`, `type`, `field`) VALUES(99, 10, 2, 3, 'abc') ON DUPLICATE KEY UPDATE `aaa`=`aaa`+99;

Неактивен

 

#5 07.11.2015 19:46:42

Kim
Участник
Зарегистрирован: 31.01.2015
Сообщений: 16

Re: Триггер вставки перед обновлением

Понятно, большое спасибо. В моем случае 99 - это сотни мегабайт данных. Буду использовать два запроса.

Неактивен

 

#6 07.11.2015 20:07:32

rgbeast
Администратор
MySQL Authorized Developer and DBA
Откуда: Москва
Зарегистрирован: 21.01.2007
Сообщений: 3880

Re: Триггер вставки перед обновлением

В двух запросах нет ничего страшного. Проверить есть ли запись по ключу - по определению очень быстрый запрос.

Неактивен

 

Board footer

Работает на PunBB
© Copyright 2002–2008 Rickard Andersson