Mysql как упростить? есть строка, тогда update, нет - insert

dandandan

Мой дом здесь!
Регистрация
7 Авг 2008
Сообщения
1.036
Реакции
292
Постоянно сталкиваюсь с необходимостью проверки существования строк.

Проверку делаю с помощью SELECT,
затем, если строка существует, то делаю UPDATE этой строки,
Если строка не существует, то делаю INSERT

Все операции выполняются с одной и той же строкой в одной и той же таблице.

Можно ли эти 3 операции свести к одному mysql запросу? Или как оптимизировать такие действия?
Может функцию в mysql прописывать или триггер какой-нибудь (ни с тем ни сдругим дела не имел)?
 
есть такой синтакс
INSERT ... ON DUPLICATE KEY UPDATE
Для просмотра ссылки Войди или Зарегистрируйся
подойдёт например когда есть уникальное поле, если значение такого поля есть то обновляется, если нет то добавляется
 
К сожалению, поля неуникальные. В таблице 3 поля, по которым делается выборка и четвертое поле для вставки значения. Вот если сразу 3 поля взять, то будет уникальным этот блок из трех полей. Как я понимаю ON Duplicate KEY не работает так. В мануале не написано ничего про этот случай.

Может какая-нибудь связка через IF в mysql запросе возможна ? Что-то вроде IF(SELECT count(id) FROM... =1, UPDATE..., INSERT...)
 
так поцепи на все 3 поля уникальный ключ
в любом случае это будет только плюсом при поиске
да и ON Duplicate KEY будет работать

>>>Может какая-нибудь связка через IF в mysql запросе возможна ? Что-то вроде IF(SELECT count(id) FROM... =1, UPDATE..., INSERT...)
так процедурами можно че-то слепить .. но вродь смысла нет с ними играться, UNIQUE INDEX на 3 колонки + ON Duplicate KEY вполне справиться с задачей ( если я ее верно понял )
 
Не могут значения в этих полях быть уникальными, к сожалению. Только если все три поля слепить воедино, но тогда поиск неудобно будет делать из другого запроса.
 
я говорю сделать уникальным не каждое из трех полей по отдельности, а все три поля сразу в виде одной уникальной связки

Код:
CREATE TABLE test.t2(
  c2 INT(11) UNSIGNED NOT NULL,
  c3 INT(11) UNSIGNED NOT NULL,
  c1 INT(11) UNSIGNED NOT NULL,
  `text` VARCHAR(255) DEFAULT NULL,
  UNIQUE INDEX UK_t2 (c1, c2, c3)       --   ВОТ ТАКОЙ ШТУКОЙ  
)
ENGINE = INNODB
 
т.е. фактически эти поля будут независимы и разделены друг от друга
но в пределах индекса ( ключа ) они будут "слиты воедино"
 
Понял, еще 2 вопроса.
Обязательно тип innodb? и название индекса UK_t2 как-то будет влиять на текст запроса, как в примере по ссылке выше?
INSERT INTO table (a,b,c) VALUES (1,2,3)
ON DUPLICATE KEY UPDATE c=c+1;
Тут вроде бы индексы нигде не указываются
 
тип innodb не обязательно
название индекса используют лишь для тестирования скорости работы запросов ( чтоб видеть где какой индекс юзается ) так что на сам запрос оно никак не повлияет и может быть любым

>>Тут вроде бы индексы нигде не указываются
субд сама вчехлит
 
Еще вопросик возник в phpmyadmin при создании индекса можно указать видимо его рамер

ALTER TABLE `user_kolvo_priglasheniy` ADD UNIQUE `asdfd` ( `hash` ( 34 ) , `email` ( 50 ) )
а можно не указывать
ALTER TABLE `user_kolvo_priglasheniy` ADD UNIQUE `asdf` ( `hash` , `email` )

Чем первый вариант лучше или хуже? Что за цифры в конце стоят ? ( 34 ) и ( 50 ) - это количество символов в соответствующем поле базы данных?
 
Назад
Сверху