Задавайте вопросы, мы ответим
Вы не зашли.
Есть пустая таблица:
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?
Неактивен
Вариант с триггером не работоспособен сразу по двум причинам:
1. триггер сработает только если update происходит, то есть только если запись есть
2. в триггере нельзя менять ту же таблицу
Используйте
Неактивен
Спасибо за ответ. 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.
Неактивен
Неактивен
Понятно, большое спасибо. В моем случае 99 - это сотни мегабайт данных. Буду использовать два запроса.
Неактивен
В двух запросах нет ничего страшного. Проверить есть ли запись по ключу - по определению очень быстрый запрос.
Неактивен