Рейтинг темы:
  • 0 Голос(ов) - 0 в среднем
  • 1
  • 2
  • 3
  • 4
  • 5
Ищу MySQL запрос
#1
Здравствуйте господа,

Не подскажете MySQL запрос на добавление итема всем персонажам на сервере?

Благодарю.

pwsoft сборка.
Ответ
#2
Если есть временная таблица типа character_items

[SRC="sql"]INSERT INTO character_items (owner_id, item_id, count, enchant_level) SELECT charid, 4037, 10, 0 FROM characters;[/SRC]

4037 - ID итема
10 - количество
0 - уровень заточки


после релога любой из игроков получит итемы
Вот бы сделать дома уборку и нажать "СОХРАНИТЬ"!)
Ответ
#3
dorocki Написал:Если есть временная таблица типа character_items

[SRC="sql"]INSERT INTO character_items (owner_id, item_id, count, enchant_level) SELECT charid, 4037, 10, 0 FROM characters;[/SRC]

4037 - ID итема
10 - количество
0 - уровень заточки


после релога любой из игроков получит итемы

Только Items таблица есть.
Ответ
#4
ну тогда просто вместо `characters_items` поставьте `items`
Ответ
#5
Выполнил вот такой запрос
Код:
INSERT INTO items (owner_id, item_id, COUNT, enchant_level) SELECT obj_Id, 25005, 10, 0 FROM characters;
но ошибочка вышла
Код:
1062 - Duplicate entry '0' for key 'PRIMARY'
Ответ
#6
Такой инсерт не годится, проблема в object_id - по дефолту при инсерте он будет 0 для каждой строчки, и после вставки первого предмета второй уже не вставится, т.к. object_id - это ключ таблицы и не допускает повторений.
К тому же object_id используется для всех сущностей в Л2 поэтому вставлять свои рендомные object_id тоже недопутимо, иначе после рестарта сервера получится дикая каша и сервак можно смело восстанавливать из бекапов.

Направление действий следующее: если сервак в этот момент работает, то в базу не лезть. Когда сервак остановишь найди максимальный object_id по всем таблицам какие есть в бд, а уже после этого можно писать запрос с инкрементами опираясь на максимальный object_id.

Либо сделать программно функционал, если есть сырцы.
Ответ
#7
Mosinnik Написал:Такой инсерт не годится, проблема в object_id - по дефолту при инсерте он будет 0 для каждой строчки, и после вставки первого предмета второй уже не вставится, т.к. object_id - это ключ таблицы и не допускает повторений.
К тому же object_id используется для всех сущностей в Л2 поэтому вставлять свои рендомные object_id тоже недопутимо, иначе после рестарта сервера получится дикая каша и сервак можно смело восстанавливать из бекапов.

Направление действий следующее: если сервак в этот момент работает, то в базу не лезть. Когда сервак остановишь найди максимальный object_id по всем таблицам какие есть в бд, а уже после этого можно писать запрос с инкрементами опираясь на максимальный object_id.

Либо сделать программно функционал, если есть сырцы.

Исходников нет, а можно пример запроса?
Ответ
#8
Базы pw под рукой нету, поэтому на том что есть накидал. Сделал допущение что предметы обновляются чаще всего и не очень интенсивно. соответственно заменить item_id, count,enchant_level на свои

INSERT INTO `items`
(`owner_id`,
`object_id`,
`item_id`,
`count`,
`enchant_level`)
SELECT
t2.charId AS `owner_id`,
@n:=@n+1 AS `object_id`,
999999 AS `item_id`,
1 AS`count`,
0 AS `enchant_level`
FROM ( SELECT ch.obj_Id AS charId, @n:=(SELECT MAX( items.object_id )+10000 FROM items ) FROM characters ch ) t2



вкратце:
берем максимальное object_id из items к нему прибавляем 10к (можно поставить 100к например) и считаем что id и считаем что в базе нету большего id, (если есть то будет лажа, например какойнить клан с подобным id и вскроется оно не скоро)
затем начиная с этого object_id генерируем для каждого нового предмета, увеличивая каждый раз на 1

И еще раз напоминаю: делать при запущеном серваке только на свой страх и риск!
Ответ
#9
Mosinnik Написал:Базы pw под рукой нету, поэтому на том что есть накидал. Сделал допущение что предметы обновляются чаще всего и не очень интенсивно. соответственно заменить item_id, count,enchant_level на свои

INSERT INTO `items`
(`owner_id`,
`object_id`,
`item_id`,
`count`,
`enchant_level`)
SELECT
t2.charId AS `owner_id`,
@n:=@n+1 AS `object_id`,
999999 AS `item_id`,
1 AS`count`,
0 AS `enchant_level`
FROM ( SELECT ch.obj_Id AS charId, @n:=(SELECT MAX( items.object_id )+10000 FROM items ) FROM characters ch ) t2



вкратце:
берем максимальное object_id из items к нему прибавляем 10к (можно поставить 100к например) и считаем что id и считаем что в базе нету большего id, (если есть то будет лажа, например какойнить клан с подобным id и вскроется оно не скоро)
затем начиная с этого object_id генерируем для каждого нового предмета, увеличивая каждый раз на 1

И еще раз напоминаю: делать при запущеном серваке только на свой страх и риск!

Простите за мою глупость, а можно вот на примере моей базы. дабы было достоверно.

characters.sql
items.sql

Собственно сюда суть такова, мне нужно предмет с ID 25005 добавить всем персонажам.

Буду благодарен за помощь.
Ответ
#10
А что вам мешает это сделать через ядро? К тому же в ядре взять новый (следующий) номер объекта куда проще чем городить костыли.
Родился, живу и когда-нибудь умру.
Ответ


Возможно похожие темы ...
Тема Автор Ответы Просмотры Последний пост
  При запуске game server на сайте (sw13) ошибка mysql 0 AndreDeiu 1 1,412 09-27-2020, 11:32 PM
Последний пост: Lord_Gothic
  запрос sql. добавить предмет в дроп мобам по уровню sheg300 2 1,970 06-17-2018, 09:48 PM
Последний пост: PROGRAMMATOR
  Mysql cjhrxSS 1 1,705 04-06-2018, 09:37 AM
Последний пост: cjhrxSS
  Помогите создать правильный mssql запрос ussyka 2 1,580 09-03-2016, 12:32 AM
Последний пост: Stenly76
  Потеря конекта с MySql flopix 3 1,358 02-23-2016, 12:30 AM
Последний пост: RedIst
  Sql запрос Verizon 4 1,614 02-20-2016, 07:44 PM
Последний пост: PROGRAMMATOR
  Помогите составить правильно SQL запрос itcry 2 1,365 02-05-2016, 01:35 PM
Последний пост: itcry
  Подскажите запрос mego4el 9 2,283 09-18-2015, 04:07 PM
Последний пост: Dementor
  mysql 5.5 4ePtb 0 1,191 03-25-2015, 02:38 PM
Последний пост: 4ePtb
  Зависают запросы MySQL Zhelnar 12 4,263 08-08-2014, 01:58 PM
Последний пост: SouthBridge

Перейти к форуму:


Пользователи, просматривающие эту тему: 1 Гость(ей)