|
|
|
помогите выбрать самый быстрый вариант
|
|||
|---|---|---|---|
|
#18+
Есть таблица: Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. в таблице помимо id может быть любое количество разных полей с индексами. В таблице существует запись: Код: sql 1. 2. 3. 4. выплняю запросы: Код: sql 1. 2. После каждого запроса мне нужно вывести id записи. При наличии похожих данных (запрос 1) вывести id существущей записи. При отсутствии подобных данных в таблице (запрос 2), записать данные и вывести что-то вроде last_insert_id(). Это все делается удачно в вышеописанном коде, но делается жутко долго. Если использовать ON DUPLICATE KEY UPDATE, то нужно чтобы id был уникальным полем и обязательно передавался в запросе. Поэтому запрос: Код: sql 1. не срабатывает, как хотелось бы, а просто записывает еще одну запись в таблицу. Можно ли заставить при insert делать проверку на дубликаты по передаваемым полям, а не по уникальному ключу? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.09.2014, 16:05:36 |
|
||
|
помогите выбрать самый быстрый вариант
|
|||
|---|---|---|---|
|
#18+
Артем_sqlМожно ли заставить при insert делать проверку на дубликаты по передаваемым полям, а не по уникальному ключу?Что мешает создать еще один уникальный ключ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.09.2014, 16:19:44 |
|
||
|
помогите выбрать самый быстрый вариант
|
|||
|---|---|---|---|
|
#18+
miksoftАртем_sqlМожно ли заставить при insert делать проверку на дубликаты по передаваемым полям, а не по уникальному ключу?Что мешает создать еще один уникальный ключ? какой например? name не могу, так как владимиров может быть много, как и surname. для ясности скажу, что путем парсинга xml данных я записываю их в базу. в разных xml могут быть сведения об одном и том же человеке. в таком случае мне нужно избежать запись, а просто вывести id существующей записи. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.09.2014, 16:28:01 |
|
||
|
помогите выбрать самый быстрый вариант
|
|||
|---|---|---|---|
|
#18+
Артем_sqlкакой например?(`name`, `surname`) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.09.2014, 16:35:16 |
|
||
|
помогите выбрать самый быстрый вариант
|
|||
|---|---|---|---|
|
#18+
Артем_sql name не могу, так как владимиров может быть много, как и surname. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.09.2014, 16:37:01 |
|
||
|
помогите выбрать самый быстрый вариант
|
|||
|---|---|---|---|
|
#18+
Артем_sql, Не понял, что Вы хотите сказать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.09.2014, 16:37:31 |
|
||
|
помогите выбрать самый быстрый вариант
|
|||
|---|---|---|---|
|
#18+
miksoftАртем_sql, Не понял, что Вы хотите сказать. я хочу сказать, что ни одно поле сделать уникальным я не могу. Так как имена могут повторяться, как и фамилии. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.09.2014, 16:44:18 |
|
||
|
помогите выбрать самый быстрый вариант
|
|||
|---|---|---|---|
|
#18+
Артем_sql, Так я предлагаю не "одно поле", а уникальный ключ из двух полей. Даже круглые скобки оставил, чтобы удобно было в синтаксис копипастить. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.09.2014, 16:46:33 |
|
||
|
помогите выбрать самый быстрый вариант
|
|||
|---|---|---|---|
|
#18+
miksoftАртем_sql, Так я предлагаю не "одно поле", а уникальный ключ из двух полей. Даже круглые скобки оставил, чтобы удобно было в синтаксис копипастить. То есть как-то так ? Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.09.2014, 16:55:47 |
|
||
|
помогите выбрать самый быстрый вариант
|
|||
|---|---|---|---|
|
#18+
Значит запрос делаю такой: Код: sql 1. А можно ли как-то максимально быстым образом вывести id после добавления в базу или вывести id существующей записи, если она есть? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.09.2014, 17:05:57 |
|
||
|
помогите выбрать самый быстрый вариант
|
|||
|---|---|---|---|
|
#18+
Артем_sqlА можно ли как-то максимально быстым образом вывести id после добавления в базу или вывести id существующей записи, если она есть? просто, если это реализовать на php, то получается такой процесс: 1. делаю insert 2. при положительном результате делаю select last_insert_id() 3. при отрицательном результате делаю select id from...where {поля которые пытался записать} И если записей несколько десятков тысяч, то система виснет ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.09.2014, 17:09:39 |
|
||
|
помогите выбрать самый быстрый вариант
|
|||
|---|---|---|---|
|
#18+
Делай 1) Insert Ignore 2) Select. Этого достаточно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.09.2014, 17:20:01 |
|
||
|
помогите выбрать самый быстрый вариант
|
|||
|---|---|---|---|
|
#18+
Артем_sqllast_insert_id()last_insert_id() полезен и в случае INSERT ... ON DUPLICATE KEY UPDATE. См. LAST_INSERT_ID() , в т.ч. последний пример. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.09.2014, 17:25:09 |
|
||
|
помогите выбрать самый быстрый вариант
|
|||
|---|---|---|---|
|
#18+
Артем_sqlИ если записей несколько десятков тысяч, то система виснетА это, скорее всего, потому что индексов не хватает. Создание ключа и этот момент облегчит. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.09.2014, 17:25:56 |
|
||
|
помогите выбрать самый быстрый вариант
|
|||
|---|---|---|---|
|
#18+
Артем_sqlАртем_sqlА можно ли как-то максимально быстым образом вывести id после добавления в базу или вывести id существующей записи, если она есть? просто, если это реализовать на php, то получается такой процесс: 1. делаю insert 2. при положительном результате делаю select last_insert_id() 3. при отрицательном результате делаю select id from...where {поля которые пытался записать} И если записей несколько десятков тысяч, то система виснет Артем, такая задача решается так: в браузере на яваскрипте запускается очередь по модели связного списка на коллбеках и прогоняется весь список, таким образом каждое обращение к бекенду становится относительно дешевым и хотя у нас увеличивается время всей обработке и мы создаем чуть большую нагрузку на трафик, но сервер при этом мы не выжигаем, а система обретает огромную стабильность. Это решение проверено в очень серьезных проектах и не с десятками тысяч, а с дестяками миллионов записей! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.09.2014, 21:02:58 |
|
||
|
помогите выбрать самый быстрый вариант
|
|||
|---|---|---|---|
|
#18+
miksoftАртем_sqlМожно ли заставить при insert делать проверку на дубликаты по передаваемым полям, а не по уникальному ключу?Что мешает создать еще один уникальный ключ? Очевидно, отсутствие естественного ключа ... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.09.2014, 00:35:16 |
|
||
|
помогите выбрать самый быстрый вариант
|
|||
|---|---|---|---|
|
#18+
Артем_sqlАртем_sqlА можно ли как-то максимально быстым образом вывести id после добавления в базу или вывести id существующей записи, если она есть? просто, если это реализовать на php, то получается такой процесс: 1. делаю insert 2. при положительном результате делаю select last_insert_id() 3. при отрицательном результате делаю select id from...where {поля которые пытался записать} И если записей несколько десятков тысяч, то система виснет Лучше это делать на сервере, одним запросом, в хранимой процедуре. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.09.2014, 00:37:42 |
|
||
|
помогите выбрать самый быстрый вариант
|
|||
|---|---|---|---|
|
#18+
MasterZivЛучше это делать на сервере, одним запросом, в хранимой процедуре. Не понимаю, почему запрос Код: sql 1. выводит id существующей записи, а если я делаю так: Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. в обоих случая ответ null. Почему так? что я не так делаю? подскажите плиз.. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.09.2014, 14:14:57 |
|
||
|
помогите выбрать самый быстрый вариант
|
|||
|---|---|---|---|
|
#18+
Артем_sql, А где Вы взяли конструкцию RETURN (SELECT ...) ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.09.2014, 14:18:46 |
|
||
|
помогите выбрать самый быстрый вариант
|
|||
|---|---|---|---|
|
#18+
miksoftАртем_sql, А где Вы взяли конструкцию RETURN (SELECT ...) ? В инете копался, искал всякие примеры по созданию функций. Изначально мой код был такой: [code] BEGIN SET isset_id = (select id from `fixtures` where `sport`=sport_name); IF isset_id is not null THEN RETURN isset_id; ELSE INSERT INTO `fixtures` ( `sport`) VALUES ,sport); SET insert_id = (select last_insert_id() as id); RETURN insert_id; END IF; END; [code] ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.09.2014, 14:22:03 |
|
||
|
помогите выбрать самый быстрый вариант
|
|||
|---|---|---|---|
|
#18+
Артем_sql, Возможно, тот код был для других СУБД. Освойте конструкцию SELECT ... INTO ... См. http://dev.mysql.com/doc/refman/5.5/en/select-into.html ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.09.2014, 14:31:28 |
|
||
|
помогите выбрать самый быстрый вариант
|
|||
|---|---|---|---|
|
#18+
ничего не понимаю... В таблице имеются записи: Код: sql 1. 2. 3. Код процедуры: Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. Делаю запросы: Код: sql 1. 2. Как так? Что не так в коде? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.09.2014, 16:05:57 |
|
||
|
помогите выбрать самый быстрый вариант
|
|||
|---|---|---|---|
|
#18+
Артем_sql Код: sql 1. id всегда равно id, чтобы это ни было :) Называйте объекты в БД разными именами. Хотя бы в пределах одной области видимости. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.09.2014, 16:08:22 |
|
||
|
помогите выбрать самый быстрый вариант
|
|||
|---|---|---|---|
|
#18+
miksoftАртем_sql Код: sql 1. id всегда равно id, чтобы это ни было :) Называйте объекты в БД разными именами. Хотя бы в пределах одной области видимости. а разве id и `id` - это не разные вещи? никогда не обращал внимание на это :D ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.09.2014, 16:14:05 |
|
||
|
помогите выбрать самый быстрый вариант
|
|||
|---|---|---|---|
|
#18+
Артем_sqlа разве id и `id` - это не разные вещи?Нет, это одно и то же. Апострофы не обязательны для употребления, если идентификатор может быть корректно выделен в тексте запроса. Например, идентификаторы, которые совпадают с ключевыми словами, обязательно заключать в апострофы. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.09.2014, 16:19:34 |
|
||
|
|

start [/forum/topic.php?fid=47&msg=38751749&tid=1834203]: |
0ms |
get settings: |
9ms |
get forum list: |
16ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
111ms |
get topic data: |
7ms |
get forum data: |
2ms |
get page messages: |
38ms |
get tp. blocked users: |
1ms |
| others: | 231ms |
| total: | 423ms |

| 0 / 0 |
