Извините, ничего не найдено.

Не расстраивайся! Лучше выпей чайку!
Регистрация
Справка
Календарь

Вернуться   forum.boolean.name > Веб-программирование > PHP / MySQL

PHP / MySQL Создание динамических Веб-ресурсов

Ответ
 
Опции темы
Старый 05.02.2013, 15:09   #1
pax
Unity/C# кодер
 
Аватар для pax
 
Регистрация: 03.10.2005
Адрес: Россия, Рязань
Сообщений: 7,568
Написано 3,006 полезных сообщений
(для 5,323 пользователей)
Добавить запись если не существует.

Подскажите лучший вариант реализации такого сабжа, есть ли возможность записать это в один запрос, а не делать сначала select а потом insert или update (MySQL)?
__________________
Blitz3d to Unity Wiki

Последний раз редактировалось pax, 05.02.2013 в 17:44.
(Offline)
 
Ответить с цитированием
Старый 05.02.2013, 22:46   #2
Randomize
[object Object]
 
Аватар для Randomize
 
Регистрация: 01.08.2008
Адрес: В России
Сообщений: 4,354
Написано 2,470 полезных сообщений
(для 6,850 пользователей)
Ответ: Добавить запись если не существует.

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)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
pax (05.02.2013)
Старый 05.02.2013, 22:54   #3
moka
.
 
Регистрация: 05.08.2006
Сообщений: 10,429
Написано 3,454 полезных сообщений
(для 6,863 пользователей)
Ответ: Добавить запись если не существует.

INSERT IGNORE INTO table
IGNORE - не вставит если произойдёт коллизия каких либо Primary или Unique значений.

Копипаст от сюда: http://stackoverflow.com/questions/1...xists-in-mysql
(Offline)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
pax (05.02.2013)
Старый 05.02.2013, 22:57   #4
pax
Unity/C# кодер
 
Аватар для pax
 
Регистрация: 03.10.2005
Адрес: Россия, Рязань
Сообщений: 7,568
Написано 3,006 полезных сообщений
(для 5,323 пользователей)
Ответ: Добавить запись если не существует.

А если не знаешь primary key?
__________________
Blitz3d to Unity Wiki
(Offline)
 
Ответить с цитированием
Старый 05.02.2013, 22:58   #5
moka
.
 
Регистрация: 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)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
ABTOMAT (06.02.2013)
Старый 05.02.2013, 23:52   #6
pax
Unity/C# кодер
 
Аватар для pax
 
Регистрация: 03.10.2005
Адрес: Россия, Рязань
Сообщений: 7,568
Написано 3,006 полезных сообщений
(для 5,323 пользователей)
Ответ: Добавить запись если не существует.

У меня таблица параметров игрока, уникальна связка id игрока и id параметра, есть еще id записи. Получается надо создать связанный ключ из первых двух, а id записи выкинуть?

UPD: т.е. примерно такая таблица:
__________________
Blitz3d to Unity Wiki
(Offline)
 
Ответить с цитированием
Старый 06.02.2013, 00:12   #7
moka
.
 
Регистрация: 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
pax
Unity/C# кодер
 
Аватар для pax
 
Регистрация: 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 поиск будет медленный?
__________________
Blitz3d to Unity Wiki
(Offline)
 
Ответить с цитированием
Старый 06.02.2013, 00:15   #9
moka
.
 
Регистрация: 05.08.2006
Сообщений: 10,429
Написано 3,454 полезных сообщений
(для 6,863 пользователей)
Ответ: Добавить запись если не существует.

Если нету записи - вставит, если есть, обновит значение, прибавив к прошлому новое.
(Offline)
 
Ответить с цитированием
Старый 06.02.2013, 00:16   #10
pax
Unity/C# кодер
 
Аватар для pax
 
Регистрация: 03.10.2005
Адрес: Россия, Рязань
Сообщений: 7,568
Написано 3,006 полезных сообщений
(для 5,323 пользователей)
Ответ: Добавить запись если не существует.

по user будет поиск медленный с таким ключем? типа select * from user_params where user= :user
__________________
Blitz3d to Unity Wiki
(Offline)
 
Ответить с цитированием
Старый 06.02.2013, 00:22   #11
moka
.
 
Регистрация: 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)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
pax (06.02.2013)
Старый 06.02.2013, 00:23   #12
pax
Unity/C# кодер
 
Аватар для pax
 
Регистрация: 03.10.2005
Адрес: Россия, Рязань
Сообщений: 7,568
Написано 3,006 полезных сообщений
(для 5,323 пользователей)
Ответ: Добавить запись если не существует.

Значит мне подходит, спасибо.
__________________
Blitz3d to Unity Wiki
(Offline)
 
Ответить с цитированием
Старый 06.02.2013, 00:23   #13
moka
.
 
Регистрация: 05.08.2006
Сообщений: 10,429
Написано 3,454 полезных сообщений
(для 6,863 пользователей)
Ответ: Добавить запись если не существует.

Я тоже кое-что выучил..
(Offline)
 
Ответить с цитированием
Старый 06.02.2013, 00:32   #14
pax
Unity/C# кодер
 
Аватар для pax
 
Регистрация: 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 ведь поиск получется...
__________________
Blitz3d to Unity Wiki
(Offline)
 
Ответить с цитированием
Старый 06.02.2013, 02:59   #15
moka
.
 
Регистрация: 05.08.2006
Сообщений: 10,429
Написано 3,454 полезных сообщений
(для 6,863 пользователей)
Ответ: Добавить запись если не существует.

Будет искать по user да, индекс сработает. Но учти что JOIN вернёт только если будет совмещение.
Например если есть запись в user_params а записи в parameters нету (по id как ты соединяешь), то JOIN ничего не возвратит.

Твой запрос возвратит все параметры определённого юзверя.
(Offline)
 
Ответить с цитированием
Ответ


Опции темы

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


Часовой пояс GMT +4, время: 19:08.


vBulletin® Version 3.6.5.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot
Style crйe par Allan - vBulletin-Ressources.com