[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Автоинкремент при INSERT DUPLICATE
Страницы: 1, 2
twin
Цитата (Arh @ 9.10.2017 - 18:24)
В смысле самому проверить, а потом обновить или добавить, или есть какая то хитрая штука, или вообще забыть про эту фичу и не париться?

Да, обычно на стороне PHP эмулируют несколькими запросами.

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

Нужно уважать мнение оппонета. Ведь заблуждаться - его святое право.

Настаивал, настаиваю и буду настаивать на своем. На кедровых орешках.

user posted image
sergeiss
Цитата (Arh @ 9.10.2017 - 22:24)
А как там кстати это решается?

В триггере вставки можешь проверить данные по любым параметрам и, если надо, то отказываешься от вставки. Пропуск в автоинкременте также получишь. То есть, ты просто даёшь команду инсерт и не паришься. БД сама все сделает.
Можешь сделать функцию в самой БД, которая будет делать такую проверку. Впрочем, функцию можно и в Мускуле сделать smile.gif
А проверять в ПХП, делая несколько запросов... Это долго и не рационально. Каждая часть должна заниматься своими задачами. Если уж БД отвечает за данные, то не надо передавать эту задачу в ПХП.

_____________
* Хэлп по PHP
* Описалово по JavaScript
* Хэлп и СУБД для PostgreSQL

* Обучаю PHP, JS, вёрстке. Интерактивно и качественно. За разумные деньги.

* "накапливаю умение телепатии" (С) и "гуглю за ваш счет" (С)

user posted image
twin
Цитата (sergeiss @ 10.10.2017 - 04:42)
Если уж БД отвечает за данные, те не надо передавать эту задачу в ПХП
Расскажи это любителям новомодных "доктрин" smile.gif

На самом деле тут я на твоей стороне большей частью, но иногда два атомарных запроса выгоднее одного навароченого. Все зависит от ситуации.

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

Нужно уважать мнение оппонета. Ведь заблуждаться - его святое право.

Настаивал, настаиваю и буду настаивать на своем. На кедровых орешках.

user posted image
sergeiss
Цитата (twin @ 10.10.2017 - 10:50)
Расскажи это любителям новомодных "доктрин"

Это их проблемы smile.gif Я всегда утверждал и буду утверждать, что БД должна выдать данные в уже готовом виде. Триггеры, вьюхи, партиции, функции, джойны, пользовательские типы данных - все надо задействовать, по необходимости. Никакой серьезной обработки после БД не должно быть в ПХП или каком другом языке. Если только совсем по мелочи что-то.
А для этого и нужно хорошо знать и использовать все возможности своей БД.

_____________
* Хэлп по PHP
* Описалово по JavaScript
* Хэлп и СУБД для PostgreSQL

* Обучаю PHP, JS, вёрстке. Интерактивно и качественно. За разумные деньги.

* "накапливаю умение телепатии" (С) и "гуглю за ваш счет" (С)

user posted image
Arh
sergeiss
Цитата
В триггере вставки можешь проверить данные по любым параметрам

Ни разу не пользовался функциями и подобным в базе, в постгре это стандартная практика? То есть не нужно как то универсально настраивать сервак или например в разной версии постгре это по разному работает?
Это просто обработчка событий из коробки?
А то я хочу на неё перейти в новом проекте. По сути решение перейти уже принял, но пытаюсь его укрепить всячески)


_____________
Промокод предоставляет скидку на заказ домена и/или хостинга reg.ru
BFCC-3895-8804-9ED2
sergeiss
Цитата (Arh @ 10.10.2017 - 17:46)
Ни разу не пользовался функциями и подобным в базе, в постгре это стандартная практика?

Ну как бы да :) В триггере (триггерной функции) вставки/апдейта пишешь RETURN NEW - это команда о том, что надо выйти из триггера и выполнить заявленную операцию. По ходу дела можешь поменять данные в любом столбце. Если же написал RETURN NULL, то это говорит о том, что нафиг не надо выполнять эту операцию. Причем, даже когда ты грузишь много данных из файла, то управляешь индивидуально каждой командой вставки. В Мускуле такое невозможно - там ты или грузишь весь файл, или вообще ничего.

Ну и если у меня была бы проблема с тем, что идет много команд на вставку, где может быть и апдейет, то я бы сделал вьюшку и на неё повесил триггер вставки (Постгре позволяет такие манипуляции). В конце обработки обязательно пишем RETURN NULL. А в процессе обработки смотрим, есть ли данные с определенными параметрами. Если есть, то апдейтим, а если нет, то вставляем. При этом мы используем только то количество автоинкрементных айдишников, которое нам требуется.

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

-- проверяю наличие города и получаю айди города

select id_town into id_t from town where town = new.town;
if id_t is null and new.town <> '' then
insert into
town (town) values (new.town) returning id_town into id_t;
end if;


Данные грузятся из текстового файла, содержащего определенные данные. Если город уже имеется, то получаем его айди в переменную id_t. Если же его нет, то пишем его в базу и тут же получаем айди созданной записи в переменную id_t (заметь - без танцев с бубном, как было бы в случае Мускуля, тут всё просто и изящно).
Далее проверяются еще другие данные и в итоге в таблице связей создается или апдейтится запись, отвечающая за связь целой кучи параметров (если точно говорить, то грузится расписание поездов)

Вообще, давай я тебя "пошлю" вот сюда, дабы не повторяться: http://phpforum.su/index.php?showtopic=83964 Там много чего написано, по ссылкам из той темы. Будут вопросы - задавай в соответствующих темах.

Цитата (Arh @ 10.10.2017 - 17:46)
По сути решение перейти уже принял, но пытаюсь его укрепить всячески)

Даже не думай. Просто переходи :)

_____________
* Хэлп по PHP
* Описалово по JavaScript
* Хэлп и СУБД для PostgreSQL

* Обучаю PHP, JS, вёрстке. Интерактивно и качественно. За разумные деньги.

* "накапливаю умение телепатии" (С) и "гуглю за ваш счет" (С)

user posted image
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.