URL: https://www.opennet.me/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID8
Нить номер: 4597
[ Назад ]

Исходное сообщение
"Условная вставка."

Отправлено kerdan , 31-Дек-06 22:14 
Я где-то недавно видел подобную тему в этом форуме, но че-то не нашел.
Вообщем, вопрос таков:
Как (любым способом, лучше - все...) сделать запрос на вставку записи при
каком-то условии. Т.е. Если так-то то это вставить надо, иначе - нет.
Я PL еще не изучал - без него обхожусь: если это с помощью него можно,
то напишите просто пример кода.

Тупо сначало селектом проверять - идиотизм.
Типичная ситуация - один процесс проверил, решил - надо всталять, а
другой тоже самое сделал; и оба вставили...

Давно, где-то видел в доках что-то подобное, но забыл, т.к. использовать не приходилось.
Напомните, плиз.

P.S. Да! И не факт, что мускул, постгресс, оракл... - стандартное решение желательно.


Содержание

Сообщения в этом обсуждении
"Условная вставка."
Отправлено zyxman , 01-Янв-07 02:19 
>Я где-то недавно видел подобную тему в этом форуме, но че-то не
>нашел.
>Вообщем, вопрос таков:
>Как (любым способом, лучше - все...) сделать запрос на вставку записи при
>
>каком-то условии. Т.е. Если так-то то это вставить надо, иначе - нет.

есть такая штука IF (в mysql точно есть), вроде поддерживается в SQL 92


"Условная вставка."
Отправлено kerdan , 01-Янв-07 23:29 
>есть такая штука IF (в mysql точно есть), вроде поддерживается в SQL
>92

не-е, это не то.
IF EXISTS DROP .... и так далее это не то.
Я нашел ужел сам - REPLACE.
Но только, в не понял по докам - не уж-то он если нашел такую же запись будет
ее удалять и заново вставлять? Бред какой-то получается.

И еще:
Вот такая таблица:
CREATE TABLE `drv_browsers` (
  `browser_id` int(11) NOT NULL auto_increment,
  `name` varchar(64) NOT NULL default '',
  PRIMARY KEY  (`browser_id`),
  UNIQUE KEY `name` (`name`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=1;

Это для ведения статистических логов о авторизациях и на каких браузерах юзеры
входили в веб-систему...

Соответственно, если движок встречает незнакомый браузер ($_SERVER['HTTP_USER_AGENT']),
то втыкает в эту таблицу на лету.
Запрос - "REPLACE `drv_browsers` (`name`) VALUES('bla-bla')"

Я тестил в phpMyAdmin 2.6.4-pl4, MySQL 5.0.17. Так вот:

После исполнения запроса с этим реплейсом он пишет там у себя таку инфу:
Inserted rows: 2
Inserted row id: 33 (Query took 0.0004 sec)

Вопрос:
1. Почему Inserted rows: 2, а не 1 и вообще не 0, т.к. в принципе уже и не надо
было к этому времени ни чего вставлять - такая запись уже была в таблице.
2. Почему row id увеличивается при каждом новом исполнении запроса,
когда запись со значениями указанными в REPLACE в конечном счете
имеет все то же значение автоинкрементного поля? (скажем 28, а не 33,34, и т.д.)

P.S. На эти мелочи практически плевать, но просто интересно.
Если кто знает напишите пожалуйста.

P.S. Надеюсь тут после Нового Года `живые' еще есть? ;)