forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   PHP / MySQL (http://forum.boolean.name/forumdisplay.php?f=135)
-   -   Добавить запись если не существует. (http://forum.boolean.name/showthread.php?t=17836)

pax 05.02.2013 15:09

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

Randomize 05.02.2013 22:46

Ответ: Добавить запись если не существует.
 
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)

moka 05.02.2013 22:54

Ответ: Добавить запись если не существует.
 
Код:

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

Копипаст от сюда: http://stackoverflow.com/questions/1...xists-in-mysql

pax 05.02.2013 22:57

Ответ: Добавить запись если не существует.
 
А если не знаешь primary key?

moka 05.02.2013 22:58

Ответ: Добавить запись если не существует.
 
А как ты собирался проверить что запись уже существует?

UPD
Если например у тебя таблица с аккаунтами [id(primary), email(unique), name, pass, ...], и ты проверяешь по email'у, получается у тебя email - это Unique значение.
Пометь его в mysql как Unique, и затем при INSERT IGNORE возникнет коллизия по полю email, и оно вставлено не будет.

pax 05.02.2013 23:52

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

UPD: т.е. примерно такая таблица:

moka 06.02.2013 00:12

Ответ: Добавить запись если не существует.
 
Если у тебя будет несколько параметров на игрока но id параметра не будет повторяться на игрока. То я бы сделал 3 колонки смело.
Первая ID игрока - индексированная. Т.к. ты будешь часто по этому данному часто искать.
ID параметра - тут можно уже не индексировать, главное в поиске искать сперва ID игрока, а потом уже по параметру.
А вот третья колонка - уникальный Primary Key, по которому если тебе нужно получить конкретный параметр ты будешь иметь возможность сразу найти.
Он состоит из ID игрока + ID параметра.
Например:
123_456
Где 123 - ID игрока, и 456 - ID параметра.
Таким образом у тебя есть уникальный адрес на каждый параметр для любого игрока. Быстрый доступ - и точка коллизии для вставки используя IGNORE атрибут.

Всё правильно ниже.

pax 06.02.2013 00:14

Ответ: Добавить запись если не существует.
 
Т.е. так не норм?
PHP код:

$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 поиск будет медленный?

moka 06.02.2013 00:15

Ответ: Добавить запись если не существует.
 
Если нету записи - вставит, если есть, обновит значение, прибавив к прошлому новое.

pax 06.02.2013 00:16

Ответ: Добавить запись если не существует.
 
по user будет поиск медленный с таким ключем? типа select * from user_params where user= :user

moka 06.02.2013 00:22

Ответ: Добавить запись если не существует.
 
Цитата:

Сообщение от pax (Сообщение 251836)
по user будет поиск медленный с таким ключем? типа select * from user_params where user= :user

http://dev.mysql.com/doc/refman/5.0/...n-indexes.html

Будет шустро по первому индексу. Или по обоим, но не по правым.

pax 06.02.2013 00:23

Ответ: Добавить запись если не существует.
 
Значит мне подходит, спасибо.

moka 06.02.2013 00:23

Ответ: Добавить запись если не существует.
 
Я тоже кое-что выучил..

pax 06.02.2013 00:32

Ответ: Добавить запись если не существует.
 
Такой запрос тоже нормально должен сработать ведь?
PHP код:

'SELECT p.name, up.value FROM user_params up JOIN parameters p ON up.parameter = p.id WHERE up.user = ?' 

по user ведь поиск получется...

moka 06.02.2013 02:59

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

Твой запрос возвратит все параметры определённого юзверя.


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

vBulletin® Version 3.6.5.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot