[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Как исключить запись одинаковых значений в базу, у
Страницы: 1, 2, 3, 4, 5, 6
twin
sergeiss
Вообще я ждал кода, а не пространных рассуждений. И я не говорил, что запрос в цикле, это хорошо всегда. В отличии от вас с Valick. Это вы говорили, что запрос в цикле всегда плохо. Причем очень категорически говорили.

Вот я и прошу показать реализацию сей задачи без цикла. А если этого сделать нельзя, то однозначно один запрос в цикле лучше, чем два тоже в цикле. Тут то наверно не будет возражений?

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

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

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

user posted image
sergeiss
Цитата (mvg @ 22.12.2014 - 14:58)
В MySQL как уже выше отметил триггеры и stored procedure только супер пользователю.

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

Цитата (mvg @ 22.12.2014 - 14:58)
sergeiss как в postgresql дело со stored proc?

Если честно, то я с Постгре работал только на таких серверах, где было разрешено всё без исключения. Не знаю, как там "по дефолту" на общедоступных серверах.

Цитата (twin @ 22.12.2014 - 15:10)
Вот я и прошу показать реализацию сей задачи без цикла.

Одно слово: функция в Мускуле.

twin, давай не будем устраивать холивар на ровном месте? Я сказал свою точку зрения, ты высказал свою. Холиварить мне некогда, у меня тут графики хреново строятся в JS smile.gif

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

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

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

user posted image
twin
sergeiss
Какой холивар... Тут конкретика. Я написал код, ты его неаргументированно раскритиковал. Я хотел увидеть альтерантивный код. Вместо этого куча пространных рассуждений.

Ну и ладно, собственно и так было всё ясно. Не стану настаивать. smile.gif



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

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

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

user posted image
sergeiss
Цитата (twin @ 22.12.2014 - 15:31)
Я написал код, ты его неаргументированно раскритиковал.

То же самое я могу сказать и про твою критику моего алгоритма smile.gif Точно также неаргументированно совершенно критикуешь.

И вопрос не только и не столько в твоем коде. А в том, что ты "открытым текстом" пропагандируешь крамольную мысль о том, что "циклы при обращении к БД - это гуд". В первую очередь против этого было высказано.

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

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

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

user posted image
twin
Конечно гуд. В данном конкретном случае. И твой "алгоритм" я не критиковал, так как не видел кода. Просто два запроса больше чем один - это очевидно. А без цикла и ты не обойдешься. Так что ты получается еще и лицемеришь. Говоришь сначала
Цитата
Если вдруг окажется, что все 10 айди заняты, то повторяем процедуру, сгенерировав новый набор айди.
А потом
Цитата
Как только появляется обращение к БД в цикле, там, где этого можно легко избежать - это ПЛОХО. Нет, не так. Это КАТЕГОРИЧЕСКИ ПЛОХО!
Мне вот до сих пор любопытно, как ты собирался увязать это в одно целое. Повторение алгоритма и отсутствие цикла.

Но видимо не судьба. Жаль.

А я как утверждал, так и утверждаю. Запрос на вставку в цикле do... while в решении данной задачи оптимальнейший из всех возможных вариантов. По крайней мере хоть сколь-нибудь адекватную альтернативу пока никто не представил.

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

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

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

user posted image
Michael
один запрос только в случае mysql с INSERT IGNORE, а если писать совместимый для разных баз код, как это сейчас обычное дело(под фрейм и т.д.), то пролет. Вариант с исключениями не нравится. Так что и выходим к 2 запросам - сначала проверяем, потом вставляем. Это подмножество решения от Сергея.

Но и твина тоже похвалим за прикольный вариант с INSERT IGNORE, мало ли может и он когда выстрелить.

_____________
There never was a struggle in the soul of a good man that was not hard
Valick
Цитата
один запрос только в случае mysql с INSERT IGNORE

нет не один, а один или более

_____________
Стимулятор ~yoomoney - 41001303250491
twin
Valick
Имеется ввиду минимум. В противном случае два и более.

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

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

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

user posted image
volter9
Цитата (mvg @ 22.12.2014 - 13:56)
Можно еще так: вытянуть все id из БД. Сгенерить число и сравнить с массивом вытянутых результатов, и дождавшись такого число которого нет в массиве произвести запись в БД.

Неэффективно, но быстро и без лишних нагрузок на БД.

Между прочим mvg, я именно это и предложил на 3-ей странице, до того как начался спор между твином и сергеисом rolleyes.gif

_____________
Мой блог
Valick
Цитата
Между прочим mvg, я именно это и предложил на 3-ей странице

за такое предложение надо расстреливать деревянными пулями biggrin.gif

_____________
Стимулятор ~yoomoney - 41001303250491
twin
Цитата (Valick @ 22.12.2014 - 16:03)
Цитата
Между прочим mvg, я именно это и предложил на 3-ей странице

за такое предложение надо расстреливать деревянными пулями biggrin.gif

Тут я тоже взял бы ружо smile.gif

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

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

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

user posted image
volter9
Цитата (Valick @ 22.12.2014 - 20:03)
Цитата
Между прочим mvg, я именно это и предложил на 3-ей странице

за такое предложение надо расстреливать деревянными пулями :D

Обоснуйте. Ну ладно, вот мой потенциальный шах и мат:
mysql_query('INSERT INTO test (id9) SELECT ROUND((RAND(id) * (999999999 - 100000000)) + 100000000) FROM test ORDER BY id DESC LIMIT 1');

Один запрос, один занос. :)
Но перед тем как использовать таблицу, нужно сначала создать одну запись и иметь id auto_increment PK.

Пробовал вычислять сколько уникальных не повторяющих случайных чисел можно сгенерировать через PHP с seed'ами, вот результаты:

c srand() и rand():
31000 уникальных чисел до повторения.

с mt_srand() и mt_rand():
86000 уникальных чисел до повторения.

код:
$i = 0;
$randoms = array();

while (!in_array($i, $randoms)) {
mt_srand($i);
$randoms[] = mt_rand();
if ($i % 1e3 === 0) { echo $i, "\n"; }
$i ++;
}


Неуверен что будет в MySQL

_____________
Мой блог
mvg
Цитата (volter9 @ 22.12.2014 - 19:35)
Обоснуйте. Ну ладно, вот мой потенциальный шах и мат:
c srand() и rand():
31000 уникальных чисел до повторения.

с mt_srand() и mt_rand():
86000 уникальных чисел до повторения.

Не мат вовсе! Короля закрывает пешка :-).

Мы тут собрались обсуждать нереальное событие когда совершенно случайно выпадает повторение, да еще и сотня, другая следующих чисел тоже занята в БД.

volter9
Цитата (mvg @ 22.12.2014 - 20:45)
Цитата (volter9 @ 22.12.2014 - 19:35)
Обоснуйте. Ну ладно, вот мой потенциальный шах и мат:
c srand() и rand():
31000 уникальных чисел до повторения.

с mt_srand() и mt_rand():
86000 уникальных чисел до повторения.

Не мат вовсе! Короля закрывает пешка :-).

Мы тут собрались обсуждать нереальное событие когда совершенно случайно выпадает повторение, да еще и сотня, другая следующих чисел тоже занята в БД.

По этому и сказал что потенциальный smile.gif

Это в случае диапазоне 0..1, а вот в диапазоне 100000000..999999999 у меня тесты до сих пор продолжают идти.

Двигаются долго только еще 125 тысяч с mt_rand(100000000, 999999999), думаю тут уже будет меньше повторяющихся чисел.

_____________
Мой блог
twin
У меня был такой вариант, только немного хитрее
"INSERT INTO `test`  (`id9`)   SELECT SUBSTR(CONCAT(MAX(`id`), '". rand(1000000000, 9999999999) ."'), 1, 9) FROM `test`"
Но дело тут вот в чем. Во-первых это как не крути, а все те же два запроса, хотя и без вывода результата в PHP. Запрос, скажем так, нехилый. Что не говори, а SQL не очень поворотлив, когда дело доходит до встроенных функций.

Но это все мелочи. Главное, что остановило. С огромнейшей долей вероятности можно предположить, что записанное значение потребуется в логике скрипта. Так что все равно придется лепить еще один (уже третий) запрос для того, чтобы его получить.

Исходя из этого вариант с IGNORE все же самый оптимальный. Ну если не маяться дурью с универсальностью под разные СУБД.

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

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

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

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

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