Добавить запись если не существует.
Подскажите лучший вариант реализации такого сабжа, есть ли возможность записать это в один запрос, а не делать сначала select а потом insert или update (MySQL)?
|
Ответ: Добавить запись если не существует.
http://dev.mysql.com/doc/refman/5.0/...duplicate.html
Например: Код:
INSERT INTO users |
Ответ: Добавить запись если не существует.
Код:
INSERT IGNORE INTO table Копипаст от сюда: http://stackoverflow.com/questions/1...xists-in-mysql |
Ответ: Добавить запись если не существует.
А если не знаешь primary key?
|
Ответ: Добавить запись если не существует.
А как ты собирался проверить что запись уже существует?
UPD Если например у тебя таблица с аккаунтами [id(primary), email(unique), name, pass, ...], и ты проверяешь по email'у, получается у тебя email - это Unique значение. Пометь его в mysql как Unique, и затем при INSERT IGNORE возникнет коллизия по полю email, и оно вставлено не будет. |
Ответ: Добавить запись если не существует.
У меня таблица параметров игрока, уникальна связка id игрока и id параметра, есть еще id записи. Получается надо создать связанный ключ из первых двух, а id записи выкинуть?
UPD: т.е. примерно такая таблица: |
Ответ: Добавить запись если не существует.
Первая ID игрока - индексированная. Т.к. ты будешь часто по этому данному часто искать. ID параметра - тут можно уже не индексировать, главное в поиске искать сперва ID игрока, а потом уже по параметру. А вот третья колонка - уникальный Primary Key, по которому если тебе нужно получить конкретный параметр ты будешь иметь возможность сразу найти. Он состоит из ID игрока + ID параметра. Например: 123_456 Где 123 - ID игрока, и 456 - ID параметра. Таким образом у тебя есть уникальный адрес на каждый параметр для любого игрока. Быстрый доступ - и точка коллизии для вставки используя IGNORE атрибут. Всё правильно ниже. |
Ответ: Добавить запись если не существует.
Т.е. так не норм?
PHP код:
|
Ответ: Добавить запись если не существует.
Если нету записи - вставит, если есть, обновит значение, прибавив к прошлому новое.
|
Ответ: Добавить запись если не существует.
по user будет поиск медленный с таким ключем? типа select * from user_params where user= :user
|
Ответ: Добавить запись если не существует.
Цитата:
Будет шустро по первому индексу. Или по обоим, но не по правым. |
Ответ: Добавить запись если не существует.
Значит мне подходит, спасибо.
|
Ответ: Добавить запись если не существует.
Я тоже кое-что выучил..
|
Ответ: Добавить запись если не существует.
Такой запрос тоже нормально должен сработать ведь?
PHP код:
|
Ответ: Добавить запись если не существует.
Будет искать по user да, индекс сработает. Но учти что JOIN вернёт только если будет совмещение.
Например если есть запись в user_params а записи в parameters нету (по id как ты соединяешь), то JOIN ничего не возвратит. Твой запрос возвратит все параметры определённого юзверя. |
Ответ: Добавить запись если не существует.
Да мне так и надо. Теперь я думаю что мне надо искать по параметрам тоже... Т.е. получить список пользователей отфильтрованный по какому либо параметру и отсортированный по значению параметра - таблица рекордов например. Пока появилась мысль дублировать поле parameter и добавить ему индекс, а для сортировки тоже нужен индекс для значения параметра?
|
Ответ: Добавить запись если не существует.
По сути не нужны индексы для сортировки.
Единственная разница в том что если ты будешь делать запросы к данным, заместо прямого доступа по индексу, бд будет листать все данные логически отфильтровывая. Следственно, тут если нужна хорошая скорость, либо использовать индексы (но и они не всегда спасают), либо завезти отдельную таблицу которая будет обновляться в бд периодически, и выдавать её - получается кеш. Это самый шустрый вариант. Просто когда речь будет идти о десятках тысяч игроков, то не индексированный поиск и сортировка не будет быстрой затеей. |
Ответ: Добавить запись если не существует.
Отдельная таблица - хорошо, сделаю раз N минут обновление. Но индексы я создам. Создал индекс на поле parameter. Первый раз почему-то ругалось. Теперь норм)
|
Ответ: Добавить запись если не существует.
Еще интересно, такие запросы это очень плохо?
PHP код:
|
Ответ: Добавить запись если не существует.
Это называется Subquery, и если он находится во внешней части запроса (WHERE), то это будет произведено один раз перед главным запросом, и затем будет использовано.
А вот если ты сделаешь подобное до FROM - для значения, то такой Subquery будет запущен для каждой строки которая будет выведена (учитывая возможный LIMIT). По сути это ок. Вопрос, у тебя как понимаю параметр это не только имя, и id, а что-то ещё, типо тип значения, минимальное / максимальное значение? Если это всё же что-то простое, то я не вижу необходимости иметь отдельную таблицу. Если же сложное - то оправдано. |
Ответ: Добавить запись если не существует.
Я тут возможно подумаю о преобразовании поля parameter в тип enum, чтобы не получать id параметров из другой таблицы по имени. Сейчас таблица parameters просто список параметров с их id.
|
Ответ: Добавить запись если не существует.
Цитата:
Они индексируются хорошо, и поиск нормально по ним тоже если индексированы. Тем самым и читаемы, и одна таблица заместо двух. |
Ответ: Добавить запись если не существует.
да хотел не тратить лишней памяти
|
Ответ: Добавить запись если не существует.
Кстати при таком подходе и производительность будет выше, а затрачиваемой памяти будет куда меньше.
Хотя главное тут не память, а количество обращений к файловой системе. |
Ответ: Добавить запись если не существует.
В общем решил отказаться от Enum вот почему:
http://www.mysqlperformanceblog.com/...hat-is-faster/ Цитата:
PHP код:
|
Ответ: Добавить запись если не существует.
Цитата:
Если я правильно понял это константы. PHP код:
|
Ответ: Добавить запись если не существует.
чтобы понятнее было чего я хочу добиться:
PHP код:
PHP код:
PHP код:
|
Часовой пояс GMT +4, время: 23:53. |
vBulletin® Version 3.6.5.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot