Покинул форум
Сообщений всего: 314
Дата рег-ции: Нояб. 2011 Откуда: Россия
Помог: 0 раз(а)
Я не совсем догоняю, объясните алгоритм)
Вот есть бд, в ней табличка. В таблице есть имена юзеров. Предположим их 5000000.
Скрипт записывает имена юзеров в бд. Как сделать так, чтобы скрипт проверял, если такое имя в таблице?
Да, я знаю, что сначала можно сделать выборку по именам, запихнуть в массив, а потом проверить, если есть имя - откат, если нет - insert в бд. Но это не удобно: если пользователей очень много?
Есть ли какой-нибудь другой путь, который более не требовательный к ресурсам?
----- In Console We Trust. Code hard. Or die.
Striker
Отправлено: 30 Апреля, 2012 - 18:58:15
Частый гость
Покинул форум
Сообщений всего: 128
Дата рег-ции: Июль 2011 Откуда: Киев
Помог: 1 раз(а)
[+]
Цитата:
Как сделать так, чтобы скрипт проверял, если такое имя в таблице?
В самой БД, в поле, которое содержит имена пользователя добавь индекс unique
Мелкий
Отправлено: 30 Апреля, 2012 - 19:02:50
Активный участник
Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009 Откуда: Россия, Санкт-Петербург
Помог: 618 раз(а)
Tox пишет:
Да, я знаю, что сначала можно сделать выборку по именам, запихнуть в массив, а потом проверить, если есть имя
Ох и придёт же в голову...
Можно сделать уникальный индекс по имени, использовать insert ignore и проверять на affected_rows, вставилась ли строка.
Или делать какой-нибудь
И проверять на num_rows, соответственно (но и в этом случае уникальный индекс весьма кстати будет).
----- PostgreSQL DBA
Tox
Отправлено: 30 Апреля, 2012 - 19:12:49
Посетитель
Покинул форум
Сообщений всего: 314
Дата рег-ции: Нояб. 2011 Откуда: Россия
Помог: 0 раз(а)
Спасибо, помогло (Добавление)
Я правильно понял, что если используем IGNORE, то само имя, которое uniq, не переписывается, а все остальные строчки - переписываются.
То есть в tbl уже есть name, tel и тд. (Вася, 01234)
Я с помощью Insert IGNORE Into tbl вставляю 'Вася', 567. В итоге получится Вася 567?
Не совсем понятно: "Если в команде INSERT указано ключевое слово IGNORE, то вставка записей не прерывается, а строки с дублирующими значениями просто не вставляются"
----- In Console We Trust. Code hard. Or die.
Мелкий
Отправлено: 30 Апреля, 2012 - 20:05:20
Активный участник
Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009 Откуда: Россия, Санкт-Петербург
Помог: 618 раз(а)
Tox пишет:
Я правильно понял, что если используем IGNORE, то само имя, которое uniq, не переписывается, а все остальные строчки - переписываются.
Нет, новая строка игнорируется вовсе и ничего не делает.
Можно это сделать через ON DUPLICATE KEY UPDATE. Ну и сугубо mysql-фича, replace
Tox пишет:
Не совсем понятно: "Если в команде INSERT указано ключевое слово IGNORE, то вставка записей не прерывается, а строки с дублирующими значениями просто не вставляются"
Не путаете, часом, строки и поля строк? По первой цитате такое впечатление складывается.
А эта цитата относится к множественным инзертам, когда одной командой создаётся сразу много записей.
Все гости форума могут просматривать этот раздел. Только зарегистрированные пользователи могут создавать новые темы в этом разделе. Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.