Задавайте вопросы, мы ответим
Вы не зашли.
Есть запрос update xxx where `0` = '1' and `1` = '1'
Иногда строки, удолетворяющей условию `0` = '1' and `1` = '1' в таблице нет.
Мне нужно в запросе указать что в таком случае нужно предварительно её создать (выполнить INSERT INTO table (`0`, `1`) VALUES ('1', '1') ) и после выполнить update, подскажите как сделать
Спасибо
Отредактированно gif-t (09.08.2011 19:50:22)
Неактивен
Указать такое в запросе нельзя.
Можно сделать несколько запросов. Например, сначала проверяете есть ли строки, удовлетворяющие условию, затем обновляете или добавляете в зависимости от результата.
P.S. Почему в случае отсутствия нужно строки вы хотите её сначала добавить, потом обновить? Что мешает сразу добавлять с нужными значениями?
Неактивен
Нужно количество запросов сократить до минимума, т.к. приложение отправляет их в огромном количестве и становится очень критична задержка по времени, т.к. каждый запрос тормозит программу. Поэтому очень нежелательно делать несколько запросов.
Насчёт сразу добавлять с нужными значениями - это, как я понял, нужно использовать ON DUPLICATE KEY и в одном запросе заполнять insert и update сразу и полностью. Т.е. отправляемые данные дублируются, отправляемая строка в 2 раза длиннее. В целом это усложнит код... я полагаю для такой распространенной задачи в MySQL наверняка что-то предусмотрено? Какой-нибудь INSUPD... Хочеться написать всё сразу правильно, без велосипедов
Отредактированно gif-t (09.08.2011 22:36:15)
Неактивен
gif-t написал:
Нужно количество запросов сократить до минимума, т.к. приложение отправляет их в огромном количестве и становится очень критична задержка по времени, т.к. каждый запрос тормозит программу. Поэтому очень нежелательно делать несколько запросов.
Как уже сказано ранее -одним запросом не получиться.
gif-t написал:
Насчёт сразу добавлять с нужными значениями - это, как я понял, нужно использовать ON DUPLICATE KEY
Зачем? Вы сначала хотите добавить строку с определенными значениями, а потом изменить эту строку, т.е. конечный вариант вам известен заранее. Что мешает при инсерте сразу указать нужные данные. Естественно речь идет о случае, когда искомая строка отсутствует.
gif-t написал:
я полагаю для такой распространенной задачи в MySQL наверняка что-то предусмотрено? Какой-нибудь INSUPD...
Не сказал бы, что задача распространена. А для чего это вам нужно?
INSUPD отсутствует http://dev.mysql.com/doc/refman/5.1/en/ … ation.html
Неактивен
Вот я нашел такой велосипед:
INSERT INTO `subscription` (`email`, `id_language`, `id_currency`)
VALUES
('1','aaa','bbb'),
('2','ccc','ddd'),
('3','eee','fff')
ON DUPLICATE KEY UPDATE
`id_language`=VALUES(`id_language`),
`id_currency`=VALUES(`id_currency`)
Но он мне всеравно не катит,... спасибо за ответ, буду пытаться решить эту проблему архитектуре приложения
Отредактированно gif-t (09.08.2011 23:44:16)
Неактивен
Простите за некропост, но я таки не понял
Что мешает сделать
1) SELECT по условиям (который должен быть шустрый и на производительность не влиять, т.е. его как доп запрос можно опустить)
2) INSERT \ UPDATE в зависимости от результатов 1) ??
Неактивен
То что select обязательно будет шустрый - неочевидно, но именно так и делают.
Неактивен