Модераторы: skyboy, MoLeX, Aliance, ksnk
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Проверка наличия записи, Update и Insert в одном запросе 
:(
    Опции темы
nextzi0
  Дата 3.10.2008, 15:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 220
Регистрация: 28.5.2008
Где: о. Корсика

Репутация: нет
Всего: нет



Возможно ли в MySQL (5.0) одним запросом проверить, есть  ли определенная запись в базе (по полю `column` например) и если есть, то обновить это поле, если нету - то вставить новую запись?
--------------------
Не бойся начинать что-то новое, помни, что ковчег построили любители - профессионалы построили "Титаник"
PM MAIL ICQ   Вверх
skyboy
Дата 3.10.2008, 16:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


неОпытный
****


Профиль
Группа: Модератор
Сообщений: 9820
Регистрация: 18.5.2006
Где: Днепропетровск

Репутация: 14
Всего: 260



Цитата(nextzi0 @  3.10.2008,  14:54 Найти цитируемый пост)
есть  ли определенная запись в базе (по полю `column` например)

я так надеюсь, речь идет о поиску по полю с уникальными значениями? и с ключом unique по ним? тогда можно использовать конструкцию 
Код

insert ... on duplicate key update

PM MAIL   Вверх
solenko
Дата 3.10.2008, 17:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1473
Регистрация: 15.1.2006
Где: Украина

Репутация: 7
Всего: 67



А еще есть оператор REPLACE


--------------------
Ла-ла-ла-ла
Заметьте, нет официального подтверждения, что это не просто четыре слога.
PM MAIL WWW ICQ Skype   Вверх
skyboy
Дата 3.10.2008, 22:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


неОпытный
****


Профиль
Группа: Модератор
Сообщений: 9820
Регистрация: 18.5.2006
Где: Днепропетровск

Репутация: 14
Всего: 260



solenko, однако delete + insert изменит значение автоинкрементного поля. потому все возможные логические свзи нарушатся(если нет FK) или удалятся все связанные объекты(если есть FK). Так ведь?
PM MAIL   Вверх
bars80080
Дата 3.10.2008, 22:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прапор творюет
****
Награды: 1



Профиль
Группа: Завсегдатай
Сообщений: 12022
Регистрация: 5.12.2007
Где: Königsberg

Репутация: 9
Всего: 315



интересная тема, немного не догнал

у меня к примеру есть таблица, в которой есть колонка с уникальными идентификаторами заказов (комбинация букв и цифр)
мне надо вставить запись туда, но я заранее не знаю, а есть ли запись уже с таким идентификатором, приходится лишний раз проверять, а хотелось бы чтобы выполнялся запрос вставки с проверкой на существование и обновление, если обнаружится
я так понимаю, этот же вопрос и у nextzi0

а обязательно ли назначать ключ им? у меня стоит стандартный уникальный id автоинкремент, но ориентироваться в данном случае нужно по другому полю
PM MAIL WWW   Вверх
skyboy
Дата 4.10.2008, 14:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


неОпытный
****


Профиль
Группа: Модератор
Сообщений: 9820
Регистрация: 18.5.2006
Где: Днепропетровск

Репутация: 14
Всего: 260



Цитата(bars80080 @  3.10.2008,  21:49 Найти цитируемый пост)
стандартный уникальный id автоинкремент

в данном случае это - главный ключ. 
Цитата(bars80080 @  3.10.2008,  21:49 Найти цитируемый пост)
а обязательно ли назначать ключ им?

т.е. ты хочешь, чтоб у тебя не было дубликатов значений в некоторых полях, но назначит unique index по ним тебе...эээ... лениво? 
да, обязательно должен быть уникальный индекс. посмотри на синтаксис:
Код

INSERT ... ON DUPLICATE KEY UPDATE

и скажи, как по-твоему, для работы конструкции необходимо совпадение значения уникального ключа или нет?

PM MAIL   Вверх
bars80080
Дата 4.10.2008, 19:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прапор творюет
****
Награды: 1



Профиль
Группа: Завсегдатай
Сообщений: 12022
Регистрация: 5.12.2007
Где: Königsberg

Репутация: 9
Всего: 315



Цитата(skyboy @  4.10.2008,  14:09 Найти цитируемый пост)
, но назначит unique index по ним тебе...эээ... лениво? 

ну почему лениво. долго читать документацию, которую я открою только может завтра, а может и через неделю, как со временем будет. оттого и спросил. потому на вопрос в конце, я могу ответить только: э-э-э-э...
PM MAIL WWW   Вверх
solenko
Дата 4.10.2008, 19:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1473
Регистрация: 15.1.2006
Где: Украина

Репутация: 7
Всего: 67



Цитата(skyboy @  3.10.2008,  21:00 Найти цитируемый пост)
solenko, однако delete + insert изменит значение автоинкрементного поля. потому все возможные логические свзи нарушатся(если нет FK) или удалятся все связанные объекты(если есть FK). Так ведь?

REPLACE не выполняет операции удаления. Он делает в точности то же что и insert ... on duplicate key update, но только по первичному ключу.



--------------------
Ла-ла-ла-ла
Заметьте, нет официального подтверждения, что это не просто четыре слога.
PM MAIL WWW ICQ Skype   Вверх
skyboy
Дата 4.10.2008, 22:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


неОпытный
****


Профиль
Группа: Модератор
Сообщений: 9820
Регистрация: 18.5.2006
Где: Днепропетровск

Репутация: 14
Всего: 260



solenko, да, наверное я просто неверно понял 
Цитата

REPLACE works exactly like INSERT, except that if an old row in the table has the same value as a new row for a PRIMARY KEY or a UNIQUE index, the old row is deleted before the new row is inserted. See Section 12.2.5, “INSERT Syntax”. 

и
Цитата

REPLACE is a MySQL extension to the SQL standard. It either inserts, or deletes and inserts.

кстати, как раз по данной тобой ссылке.

Добавлено через 7 минут и 30 секунд
Код

create table test(
id int auto_increment primary key,
name varchar(32),
unique index(name)
);
insert into test(name) values('unique');
replace test(name) values('unique');
select * from test;

вернет
Цитата

id      name
2      unique

что показывает: запись была удалена и вставлена.
PM MAIL   Вверх
solenko
Дата 5.10.2008, 11:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1473
Регистрация: 15.1.2006
Где: Украина

Репутация: 7
Всего: 67



skyboy, читаем мой предидущий пост и видим "только по первичному ключу"
Код

mysql> create table test(id int auto_increment primary key, val varchar(255));
Query OK, 0 rows affected (0.18 sec)

mysql> REPlACE INTO test VALUES (null, '1111');
Query OK, 1 row affected (0.04 sec)

mysql> SELECT * FROM test;
+----+------+
| id | val  |
+----+------+
|  1 | 1111 |
+----+------+
1 row in set (0.02 sec)

mysql> REPLACE INTO test VALUES (1, '2222');
Query OK, 2 rows affected (0.00 sec)

mysql> SELECT * FROM test;
+----+------+
| id | val  |
+----+------+
|  1 | 2222 |
+----+------+
1 row in set (0.00 sec)



--------------------
Ла-ла-ла-ла
Заметьте, нет официального подтверждения, что это не просто четыре слога.
PM MAIL WWW ICQ Skype   Вверх
skyboy
Дата 5.10.2008, 11:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


неОпытный
****


Профиль
Группа: Модератор
Сообщений: 9820
Регистрация: 18.5.2006
Где: Днепропетровск

Репутация: 14
Всего: 260



solenko, ну, так  правильно. то, что запись была удалена не возымеет никакого эффекта на значение автоинкрементного поля: мы же указываем явно значене для вставки. однако, это не означает, что запись не удаляется.
соответственно, можешь провести эксперимент с внешними ключами: просто ли replace "заменит" значение, или все же запись будет удалена и вставлена, что вызовет:
а)удаление всех записей в таблицах, имеющих внешний ключ на данную таблицу
б) вызов триггеров on before delete, on after delete, on before insert, on after insert

Добавлено через 44 секунды
или, думаешь, есть разница для replace - если дублируется первичный ключ, то удаление не происходит, а если просто по уникаьлному - то происходит?
PM MAIL   Вверх
solenko
Дата 5.10.2008, 12:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1473
Регистрация: 15.1.2006
Где: Украина

Репутация: 7
Всего: 67



чтот я тут недочитал ответ  Сейчас будем ставить эксперементы

Это сообщение отредактировал(а) solenko - 5.10.2008, 12:34


--------------------
Ла-ла-ла-ла
Заметьте, нет официального подтверждения, что это не просто четыре слога.
PM MAIL WWW ICQ Skype   Вверх
XAKEPEHOK
Дата 24.3.2012, 11:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 103
Регистрация: 18.10.2006
Где: Matrix

Репутация: нет
Всего: 0



Так вот все-таки, у меня есть таблица статистики, где нет уникальных полей. Есть дата, id пользователя, количество действий #1 и количество действий #2. 

Т.е. мне например, надо добавить +1 к количеству действий #2 за определенную дату, но я не знаю, может быть уже за эту дату было выполнено действие #1

Можно ли это реализовать одним запросом без введения уникальных полей? 
PM ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | PHP: Базы Данных | Следующая тема »


 




[ Время генерации скрипта: 0.0563 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.