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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как корректней избежать duplicate entry в mysql 
V
    Опции темы
maxipub
Дата 29.11.2013, 10:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Добрый день!

Есть таблица:

Код

CREATE TABLE IF NOT EXISTS `result` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `val` varchar(64) NOT NULL,
  UNIQUE KEY `id` (`id`),
  UNIQUE KEY `val` (`val`)
) ENGINE=MyISAM;


Данные вставляются так:

Код

INSERT INTO result (id, val) VALUES (NULL, '.$val.');


Вопрос в том, как корректней избежать ошибки Duplicate entry при попытке вставить существующую val? Если такая запись уже есть в базе - ничего менять не надо. Проверять ее существование перед вставкой не очень воодушевляет, т.к. паралельное выполнение другой копии скрипта в теории вполне может вклиниться между этими запросами.

Пока писал, пришла идея поставить что-то типа ON DUPLICATE KEY UPDATE id=id но может есть более корректное решение?
PM MAIL   Вверх
MoLeX
Дата 29.11.2013, 11:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Местный пингвин
****


Профиль
Группа: Модератор
Сообщений: 4076
Регистрация: 17.5.2007

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



Конечно есть, отдать бразды правления СУБД

Код

INSERT IGNORE INTO table …




--------------------
Amazing  smile 
PM MAIL WWW ICQ   Вверх
maxipub
Дата 29.11.2013, 12:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Тьфу ты, точно! smile  smile 
PM MAIL   Вверх
Gromdron
Дата 3.12.2013, 07:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



А зачем вообще тогда указывать это поле если оно инкрементное ?

Код

INSERT INTO result (val) VALUES ('.$val.');


Этот ответ добавлен с нового Винграда - http://vingrad.com
PM MAIL   Вверх
ksnk
Дата 3.12.2013, 09:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прохожий
****


Профиль
Группа: Комодератор
Сообщений: 6855
Регистрация: 13.4.2007
Где: СПб

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



Gromdron, Там еще и val уникальный, вроде как. Правда отсутствие приватного ключа несколько режет глаз.

Хотел бы я посмотреть как справится такая база со вставкой значений с ID из одной стоки и VAL из другой при ignore. Не грохнется? Вставится?


--------------------
Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! user posted image
PM MAIL WWW Skype   Вверх
maxipub
Дата 10.12.2013, 14:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(ksnk @  3.12.2013,  09:28 Найти цитируемый пост)
приватного ключа

Это что такое?
PM MAIL   Вверх
ksnk
Дата 10.12.2013, 14:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прохожий
****


Профиль
Группа: Комодератор
Сообщений: 6855
Регистрация: 13.4.2007
Где: СПб

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



maxipub PRIMARY, извиняюсь.


--------------------
Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! user posted image
PM MAIL WWW Skype   Вверх
baldina
Дата 10.12.2013, 17:20 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(maxipub @  29.11.2013,  10:57 Найти цитируемый пост)
Проверять ее существование перед вставкой не очень воодушевляет

по-хорошему надо проверять, и ничего страшного нет. тем боле вам наверняка понадобится id вставленной или существующей записи
Цитата(maxipub @  29.11.2013,  10:57 Найти цитируемый пост)
паралельное выполнение другой копии скрипта в теории вполне может вклиниться между этими запросами.

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


 




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


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

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