![](images/chestnut/misc/left.gif) |
PHP / MySQL Создание динамических Веб-ресурсов |
05.02.2013, 15:09
|
#1
|
Unity/C# кодер
Регистрация: 03.10.2005
Адрес: Россия, Рязань
Сообщений: 7,568
Написано 3,006 полезных сообщений (для 5,323 пользователей)
|
Добавить запись если не существует.
Подскажите лучший вариант реализации такого сабжа, есть ли возможность записать это в один запрос, а не делать сначала select а потом insert или update (MySQL)?
Последний раз редактировалось pax, 05.02.2013 в 17:44.
|
(Offline)
|
|
05.02.2013, 22:46
|
#2
|
[object Object]
Регистрация: 01.08.2008
Адрес: В России
Сообщений: 4,358
Написано 2,472 полезных сообщений (для 6,854 пользователей)
|
Ответ: Добавить запись если не существует.
http://dev.mysql.com/doc/refman/5.0/...duplicate.html
Например:
INSERT INTO users
SET
`id` = 1,
`name` = "ololosha",
`pass` ="somepass"
ON DUPLICATE KEY UPDATE
`name` = "ololosha",
`pass` = "somepass"
id - PRIMARY KEY (или UNIQUE)
__________________
Retry, Abort, Ignore? █
Intel Core i7-9700 4.70 Ghz; 64Gb; Nvidia RTX 3070
AMD Ryzen 7 3800X 4.3Ghz; 64Gb; Nvidia 1070Ti
AMD Ryzen 7 1700X 3.4Ghz; 8Gb; AMD RX 570
AMD Athlon II 2.6Ghz; 8Gb; Nvidia GTX 750 Ti
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
05.02.2013, 22:54
|
#3
|
.
Регистрация: 05.08.2006
Сообщений: 10,429
Написано 3,454 полезных сообщений (для 6,863 пользователей)
|
Ответ: Добавить запись если не существует.
IGNORE - не вставит если произойдёт коллизия каких либо Primary или Unique значений.
Копипаст от сюда: http://stackoverflow.com/questions/1...xists-in-mysql
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
05.02.2013, 22:57
|
#4
|
Unity/C# кодер
Регистрация: 03.10.2005
Адрес: Россия, Рязань
Сообщений: 7,568
Написано 3,006 полезных сообщений (для 5,323 пользователей)
|
Ответ: Добавить запись если не существует.
А если не знаешь primary key?
|
(Offline)
|
|
05.02.2013, 22:58
|
#5
|
.
Регистрация: 05.08.2006
Сообщений: 10,429
Написано 3,454 полезных сообщений (для 6,863 пользователей)
|
Ответ: Добавить запись если не существует.
А как ты собирался проверить что запись уже существует?
UPD
Если например у тебя таблица с аккаунтами [id(primary), email(unique), name, pass, ...], и ты проверяешь по email'у, получается у тебя email - это Unique значение.
Пометь его в mysql как Unique, и затем при INSERT IGNORE возникнет коллизия по полю email, и оно вставлено не будет.
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
05.02.2013, 23:52
|
#6
|
Unity/C# кодер
Регистрация: 03.10.2005
Адрес: Россия, Рязань
Сообщений: 7,568
Написано 3,006 полезных сообщений (для 5,323 пользователей)
|
Ответ: Добавить запись если не существует.
У меня таблица параметров игрока, уникальна связка id игрока и id параметра, есть еще id записи. Получается надо создать связанный ключ из первых двух, а id записи выкинуть?
UPD: т.е. примерно такая таблица:
![](http://f2.s.qip.ru/rPlo0Sk9.jpg)
|
(Offline)
|
|
06.02.2013, 00:12
|
#7
|
.
Регистрация: 05.08.2006
Сообщений: 10,429
Написано 3,454 полезных сообщений (для 6,863 пользователей)
|
Ответ: Добавить запись если не существует.
Если у тебя будет несколько параметров на игрока но id параметра не будет повторяться на игрока. То я бы сделал 3 колонки смело.
Первая ID игрока - индексированная. Т.к. ты будешь часто по этому данному часто искать.
ID параметра - тут можно уже не индексировать, главное в поиске искать сперва ID игрока, а потом уже по параметру.
А вот третья колонка - уникальный Primary Key, по которому если тебе нужно получить конкретный параметр ты будешь иметь возможность сразу найти.
Он состоит из ID игрока + ID параметра.
Например:
123_456
Где 123 - ID игрока, и 456 - ID параметра.
Таким образом у тебя есть уникальный адрес на каждый параметр для любого игрока. Быстрый доступ - и точка коллизии для вставки используя IGNORE атрибут.
Всё правильно ниже.
|
(Offline)
|
|
06.02.2013, 00:14
|
#8
|
Unity/C# кодер
Регистрация: 03.10.2005
Адрес: Россия, Рязань
Сообщений: 7,568
Написано 3,006 полезных сообщений (для 5,323 пользователей)
|
Ответ: Добавить запись если не существует.
Т.е. так не норм?
$sth = $this->dbh->prepare( 'INSERT INTO user_params (user, parameter, value) VALUES (:user, :parameter, :value1) ON DUPLICATE KEY UPDATE value = value + :value2'); $sth->execute(array( ':user' => intval($id), ':parameter' => intval($parameter), ':value1' => intval($value), ':value2' => intval($value) ));
И получается что по user поиск будет медленный?
|
(Offline)
|
|
06.02.2013, 00:15
|
#9
|
.
Регистрация: 05.08.2006
Сообщений: 10,429
Написано 3,454 полезных сообщений (для 6,863 пользователей)
|
Ответ: Добавить запись если не существует.
Если нету записи - вставит, если есть, обновит значение, прибавив к прошлому новое.
|
(Offline)
|
|
06.02.2013, 00:16
|
#10
|
Unity/C# кодер
Регистрация: 03.10.2005
Адрес: Россия, Рязань
Сообщений: 7,568
Написано 3,006 полезных сообщений (для 5,323 пользователей)
|
Ответ: Добавить запись если не существует.
по user будет поиск медленный с таким ключем? типа select * from user_params where user= :user
|
(Offline)
|
|
06.02.2013, 00:22
|
#11
|
.
Регистрация: 05.08.2006
Сообщений: 10,429
Написано 3,454 полезных сообщений (для 6,863 пользователей)
|
Ответ: Добавить запись если не существует.
Сообщение от pax
по user будет поиск медленный с таким ключем? типа select * from user_params where user= :user
|
http://dev.mysql.com/doc/refman/5.0/...n-indexes.html
Будет шустро по первому индексу. Или по обоим, но не по правым.
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
06.02.2013, 00:23
|
#12
|
Unity/C# кодер
Регистрация: 03.10.2005
Адрес: Россия, Рязань
Сообщений: 7,568
Написано 3,006 полезных сообщений (для 5,323 пользователей)
|
Ответ: Добавить запись если не существует.
Значит мне подходит, спасибо.
|
(Offline)
|
|
06.02.2013, 00:23
|
#13
|
.
Регистрация: 05.08.2006
Сообщений: 10,429
Написано 3,454 полезных сообщений (для 6,863 пользователей)
|
Ответ: Добавить запись если не существует.
Я тоже кое-что выучил..
|
(Offline)
|
|
06.02.2013, 00:32
|
#14
|
Unity/C# кодер
Регистрация: 03.10.2005
Адрес: Россия, Рязань
Сообщений: 7,568
Написано 3,006 полезных сообщений (для 5,323 пользователей)
|
Ответ: Добавить запись если не существует.
Такой запрос тоже нормально должен сработать ведь?
'SELECT p.name, up.value FROM user_params up JOIN parameters p ON up.parameter = p.id WHERE up.user = ?'
по user ведь поиск получется...
|
(Offline)
|
|
06.02.2013, 02:59
|
#15
|
.
Регистрация: 05.08.2006
Сообщений: 10,429
Написано 3,454 полезных сообщений (для 6,863 пользователей)
|
Ответ: Добавить запись если не существует.
Будет искать по user да, индекс сработает. Но учти что JOIN вернёт только если будет совмещение.
Например если есть запись в user_params а записи в parameters нету (по id как ты соединяешь), то JOIN ничего не возвратит.
Твой запрос возвратит все параметры определённого юзверя.
|
(Offline)
|
|
Ваши права в разделе
|
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 10:53.
|