![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
как узнать, добавлена ли запись ? [MySQL]
Parenek © (2007-05-18 14:25:00)есть таблица в которой поле Pole1 индексировано и имеет значение unique, выполняется такая вставка данных:mysql>
INSERT INTO table (Pole1,Pole2) VALUES (value1,value2)
ON DUPLICATE KEY UPDATE pole2=value3;
т.е. по этому добавлению если value1 уже содержится в таблице, то оно не будет добавлено, и pole2 будет изменено на value3 в той строке где найдено pole1 с таким же value1;
если не найдено value1 в таблице пo pole1 то оно будет добавлено.
а как узнать добавлена новая строка или изменена уже имеющаяся... ?
ANB (2007-05-23 17:08:00) [1]
> встречный вопрос - как блокировать?
> и соответственно снимать блокировку :)
MySQL - не мой конек. Ищи в доке или жди спецов по оному. Сходи на SQL.RU в спец.форум MySQL. Однако, ИМХО - блокировать таблицу только для того, чтобы узнать результат предыдущего DML - не лучшая идея.
Mysql (2007-05-23 16:48:00) [2]
> Да. Если специально не принять мер по блокировкам.
встречный вопрос - как блокировать?
и соответственно снимать блокировку :)
ANB (2007-05-23 12:01:00) [3]
> и между моими запросам на добавление и считывание (проверку),
> может быть произведен запрос на добавление другим клиентом?
>
Да. Если специально не принять мер по блокировкам.
Parenek (2007-05-22 20:22:00) [4]ну я про очередь знаю, вот про проверку на добавление - может ли получиться ситуация:
пытаюсь добавлять запись - она уникальна и сервер ее добавляет, я делаю запрос на проверку, чтобы это выяснить (проверяю как в 14 посте), но запросы следуют друг за другом, и между моими запросам на добавление и считывание (проверку), может быть произведен запрос на добавление другим клиентом?
Sergey13 (2007-05-22 08:51:00) [5]> [27] Parenek (22.05.07 00:46)
> если одновременнодва клиента пробуют запихнуть одно и то же Value1
Это утопия. 8-)
Они по любому встанут в очередь.
Parenek (2007-05-22 00:46:00) [6]
> ANB ©
попробую :)
кстати, а что будет делать субд, если одновременно два клиента пробуют запихнуть одно и то же Value1 (напомню: по условию одинаковых быть не должно см. пост №1) и будут ли корректны данные проверки: добавлено или исправлено (проверка в посте №14) ?
ANB (2007-05-21 18:11:00) [7]
> Parenek (21.05.07 16:28) [24]
Если синтаксис СУБД позволяет сделать мерж, то все предаврительные проверки проверки - от лукавого. Не слушай никого и делай именно так, как написал.
В оракле можно выцепить результат обработки по псевдопеременным. Раз MySQL предусмотрел такой синтаксис, значит, скорее всего, есть возможность выцепить и у него.
Sergey13 (2007-05-21 16:29:00) [8]> [23] Parenek (21.05.07 16:25)
Я отвечал на
> [19] Parenek (21.05.07 15:55)
Если в момент записи сам запросзаполнит флаговое поле, то в этом случае разночтений из-за многопользовательской работы вроде быть не может. Предыдущие мои советы оставляли лазейку для этого.
Parenek (2007-05-21 16:28:00) [9]и это кстати чуть ли не единственный самый простой и самый надежный способ проверки моего сабжа..
по крайней мере другого надежного и простого такого не знаю.. =)
но есть и недостаток - лишний запрос, чтобы узнать..
Parenek (2007-05-21 16:25:00) [10]
> Мне ничего. 8-)
я имею в виду, что то служебное поле никчему из другого поля уже видно изменение так как уже подмечено > Sergey13 © (18.05.07 15:46) [14]
Sergey13 (2007-05-21 16:22:00) [11]> [21] Parenek (21.05.07 16:19)
> и что оно даст
Мне ничего. 8-)
Parenek (2007-05-21 16:19:00) [12]и что оно даст, есл выполняется условие то, о котором ты писал..
по-моему это дублирование информации..
> Sergey13 © (18.05.07 15:46) [14]
Sergey13 (2007-05-21 16:00:00) [13]> [19] Parenek (21.05.07 15:55)
В конце концов, если уж так важно, заведи отдельное служебное поле, куда пиши код текущей операции.
Синтаксис мускула не знаю, но наверное как то так:
INSERT INTO table (Pole1,Pole2,flag) VALUES (value1,value2,0)
ON DUPLICATE KEY UPDATE pole2=value3, flag=1;
Parenek (2007-05-21 15:55:00) [14]
> Anatoly Podgoretsky © (18.05.07 21:35) [18]
согласен, а как корректнее узнать учитывая то, что добавлять данные могут несколько клиентов сразу?
Anatoly Podgoretsky (2007-05-18 21:35:00) [15]> Parenek (18.05.2007 15:07:04) [4]
Между 2 и 3 - запись может пропасть или наоборот появиться.
Parenek (2007-05-18 15:56:00) [16]
> > ON DUPLICATE KEY UPDATE
>
> а что кстати даст select last_insert_id() в случае срабатывания
> этой конструкции?
> это если конечно pole1 - autoincrement
> <Цитата>
еще не знаю :)
pole0 - autoincrement
Parenek (2007-05-18 15:54:00) [17]
> Sergey13 © (18.05.07 15:46) [14]
точно, а об это я не подумал..
позор мне начинающему бд криейтеру 8-)
Muzhichok (2007-05-18 15:53:00) [18]
> ON DUPLICATE KEY UPDATE
а что кстати даст select last_insert_id() в случае срабатывания этой конструкции?
это если конечно pole1 - autoincrement
Sergey13 (2007-05-18 15:46:00) [19]> [11] Parenek (18.05.07 15:35)
Кроме того, если value2 и value3 гарантировано раличны, то запрос ПОСЛЕ вставки
Select Pole2 from table where Pole1=value1;
также даст тебе ответ на вопрос.
Sergey13 (2007-05-18 15:44:00) [20]> [11] Parenek (18.05.07 15:35)
> примерчик можно?
Select count(Pole1) as kol_vo from table where Pole1=value1;
Если kol_vo>0 заначит запрос
INSERT INTO table (Pole1,Pole2) VALUES (value1,value2)
ON DUPLICATE KEY UPDATE pole2=value3;
проапдейтит запись[и]. Если kol_vo=0 значит вставит.