Тут могла бути ваша реклама
  • Автор теми Автор теми Fregl
  • Дата створення Дата створення
Статус: Офлайн
Реєстрація: 18.02.2007
Повідом.: 2837
Вопрос по SQL(mysql)

пишу программу-клиент под mysql на с++(gcc, qnx).
суть вопроса такая:
есть таблица Т1, в которой к примеру есть поля целочисленные id, state.
мне необходимо сделать апйдейты типа
update T1 set state=... where id=... .
айдишников много, в сумме около 400-500.
но суть в том что на этот момент некотых в таблице может не быть, а может быть и
вся таблица пуста.
как более грамотно реализовать sql запрос, что бы минимизировать ненужные выборки из бд. или придётся тупо перебирать все id select-ом, определять наличие/отсутствие этого id, после чего уже делать update/insert?
 
Ничего не нада перебирать. Кури Посилання видалено
Гы. +1. Сам не знал, с интересом почитал.
Однако вполне может быть, что ИД у пациента не уникальный - тогда метода не годится.
 
неуникальный ид - это жестоко :)
неуникальный ИД - это новое слово в теории проектирования БД!:D:D:D
Я так понимаю, что идея составного первичного ключа вам пока что в головы не приходила.
Собственно да, для учета сотрудников в конторе "Рога и Копыта" такие сложности ни к чему ;)
 
...
но суть в том что на этот момент некотых в таблице может не быть, а может быть и
вся таблица пуста.
...

Ну, как правильно сказано выше для скорости не мешало бы убедиться что ID ключевое или просто индексировано. По наличию/отсутсвию записей - вроде бы есть еще команда REPLACE как некий симбиоз insert и update, думаю, она подойдет. Ну, и еще, если сразу по нескольким значениям ID надо сделать update/insert, то можно ведь пользоваться условием типа "... where ID in (1,2,5,8,9)"
 
Посилання видалено is a MySQL extension to the SQL standard. It either inserts, or deletes and inserts. For another MySQL extension to standard SQL — that either inserts or updates — see Section 12.2.5.3, “INSERT ... ON DUPLICATE KEY UPDATE Syntax”.

Не сочиняй.
 
в данном случае id - это индекс ячейки массива ... (вобщем грубо говоря я копирую с массива устройств данные в эту таблицу при инициализации бд/или ее восстановлении из кода проги). поэтому тут id уникальный в любом случае.
 
вроде бы есть еще команда REPLACE как некий симбиоз insert и update

Какой в пень симбиоз? REPLACE - это либо insert, либо delete и insert. О чем тебе написали на сайте MySQL.

Ну, и еще, если сразу по нескольким значениям ID надо сделать update/insert, то можно ведь пользоваться условием типа "... where ID in (1,2,5,8,9)"

Вообще непонятно, что и чем ты думал.
 
Какой в пень симбиоз? REPLACE - это либо insert, либо delete и insert. О чем тебе написали на сайте MySQL.

Блин, не придирайся так к точности формулировок. Я всего лишь подстказал ТСу в какую сторону смотреть. Если он не глуп, то и сам может man почитать, главное понять о чем читать. Ему то как раз и надо делать либо insert, либо update в зависимости от наличия/отсутсвия записи с нужным ID. Как раз команда подходящая, как мне кажется.

Вообще непонятно, что и чем ты думал.
А думал я о том, что ТСу, вроде бы интересно - как установить state по нескольким записям сразу. Потому такая запись (where id in ...) иногда более удобна, чем гонять пачку запросов в цикле или еще как-то.
 
Ему то как раз и надо делать либо insert, либо update в зависимости от наличия/отсутсвия записи с нужным ID. Как раз команда подходящая, как мне кажется.
REPLACE is a MySQL extension to the SQL standard. It either inserts, or deletes and inserts
Читать умеем? хотя бы выделенное. надеюсь разница между update и delete + insert понятна.
 
Еще можно повставлять рандомные задержки и индикатор прогресса, чтоб окончательно убедить пользователя, что программа совершает немыслимые вычисления. Эту забытую со студенческих времен идею вчера выудил с поверхности башорга

кагбэ твои же слова.
 
кагбэ твои же слова.

мои, конечно. А тут они при чем. Обсуждается mysql-ная тема. Намек на то, что delete+insert дольше чем update? ну так реально придется каждый раз делать select сначала, чтобы решить - делать потом insert или update. И в этом случае это будет не быстрее, а, пожалуй, точно так же. Да и replace будет выполняться целиком на стороне сервера. А вариант с select, а затем insert/update - это один лишний переход от клиента к серверу и обратно.
 
Назад
Зверху Знизу