Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

как узнать, добавлена ли запись ? [MySQL]


Страницы:   1 2

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 значит вставит.


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо