Сообщений: 598
Тем: 44
Зарегистрирован: Jul 2008
Репутация:
1,922
11-10-2014, 02:40 AM
(Сообщение последний раз редактировалось: 11-10-2014, 03:12 AM singer.)
Здравствуйте господа,
Не подскажете MySQL запрос на добавление итема всем персонажам на сервере?
Благодарю.
pwsoft сборка.
Сообщений: 608
Тем: 41
Зарегистрирован: Aug 2012
Репутация:
1,804
Если есть временная таблица типа 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 - уровень заточки
после релога любой из игроков получит итемы
Вот бы сделать дома уборку и нажать "СОХРАНИТЬ"!)
Сообщений: 598
Тем: 44
Зарегистрирован: Jul 2008
Репутация:
1,922
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 таблица есть.
Сообщений: 537
Тем: 22
Зарегистрирован: Jan 2013
Репутация:
5,638
ну тогда просто вместо `characters_items` поставьте `items`
Сообщений: 598
Тем: 44
Зарегистрирован: Jul 2008
Репутация:
1,922
Выполнил вот такой запрос
Код: 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'
Сообщений: 14
Тем: 3
Зарегистрирован: Dec 2009
Репутация:
0
Такой инсерт не годится, проблема в object_id - по дефолту при инсерте он будет 0 для каждой строчки, и после вставки первого предмета второй уже не вставится, т.к. object_id - это ключ таблицы и не допускает повторений.
К тому же object_id используется для всех сущностей в Л2 поэтому вставлять свои рендомные object_id тоже недопутимо, иначе после рестарта сервера получится дикая каша и сервак можно смело восстанавливать из бекапов.
Направление действий следующее: если сервак в этот момент работает, то в базу не лезть. Когда сервак остановишь найди максимальный object_id по всем таблицам какие есть в бд, а уже после этого можно писать запрос с инкрементами опираясь на максимальный object_id.
Либо сделать программно функционал, если есть сырцы.
Сообщений: 598
Тем: 44
Зарегистрирован: Jul 2008
Репутация:
1,922
Mosinnik Написал:Такой инсерт не годится, проблема в object_id - по дефолту при инсерте он будет 0 для каждой строчки, и после вставки первого предмета второй уже не вставится, т.к. object_id - это ключ таблицы и не допускает повторений.
К тому же object_id используется для всех сущностей в Л2 поэтому вставлять свои рендомные object_id тоже недопутимо, иначе после рестарта сервера получится дикая каша и сервак можно смело восстанавливать из бекапов.
Направление действий следующее: если сервак в этот момент работает, то в базу не лезть. Когда сервак остановишь найди максимальный object_id по всем таблицам какие есть в бд, а уже после этого можно писать запрос с инкрементами опираясь на максимальный object_id.
Либо сделать программно функционал, если есть сырцы.
Исходников нет, а можно пример запроса?
Сообщений: 14
Тем: 3
Зарегистрирован: Dec 2009
Репутация:
0
Базы 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
И еще раз напоминаю: делать при запущеном серваке только на свой страх и риск!
Сообщений: 598
Тем: 44
Зарегистрирован: Jul 2008
Репутация:
1,922
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
Код: CREATE TABLE `characters` (
`account_name` varchar(45) character set latin1 default NULL,
`obj_Id` decimal(11,0) NOT NULL default '0',
`char_name` varchar(35) NOT NULL,
`name_color` char(6) character set latin1 NOT NULL default 'FFFFFF',
`level` decimal(11,0) default NULL,
`maxHp` decimal(11,0) default NULL,
`curHp` decimal(18,0) default NULL,
`maxCp` decimal(11,0) default NULL,
`curCp` decimal(18,0) default NULL,
`maxMp` decimal(11,0) default NULL,
`curMp` decimal(18,0) default NULL,
`acc` decimal(11,0) default NULL,
`crit` decimal(10,0) default NULL,
`evasion` decimal(11,0) default NULL,
`mAtk` decimal(11,0) default NULL,
`mDef` decimal(11,0) default NULL,
`mSpd` decimal(11,0) default NULL,
`pAtk` decimal(11,0) default NULL,
`pDef` decimal(11,0) default NULL,
`pSpd` decimal(11,0) default NULL,
`runSpd` decimal(11,0) default NULL,
`walkSpd` decimal(11,0) default NULL,
`str` decimal(11,0) default NULL,
`con` decimal(11,0) default NULL,
`dex` decimal(11,0) default NULL,
`_int` decimal(11,0) default NULL,
`men` decimal(11,0) default NULL,
`wit` decimal(11,0) default NULL,
`face` decimal(11,0) default NULL,
`hairStyle` decimal(11,0) default NULL,
`hairColor` decimal(11,0) default NULL,
`sex` decimal(11,0) default NULL,
`heading` decimal(11,0) default NULL,
`x` decimal(11,0) default NULL,
`y` decimal(11,0) default NULL,
`z` decimal(11,0) default NULL,
`movement_multiplier` decimal(9,8) default NULL,
`attack_speed_multiplier` decimal(10,9) default NULL,
`colRad` decimal(10,3) default NULL,
`colHeight` decimal(10,3) default NULL,
`exp` decimal(20,0) default NULL,
`expBeforeDeath` decimal(20,0) default '0',
`sp` decimal(11,0) default NULL,
`karma` decimal(11,0) default NULL,
`pvpkills` decimal(11,0) default NULL,
`pkkills` decimal(11,0) default NULL,
`clanid` decimal(11,0) default NULL,
`maxload` decimal(11,0) default NULL,
`race` decimal(11,0) default NULL,
`classid` decimal(11,0) default NULL,
`base_class` int(2) NOT NULL default '0',
`deletetime` decimal(20,0) default NULL,
`cancraft` decimal(11,0) default NULL,
`title` varchar(16) default NULL,
`title_color` char(6) character set latin1 NOT NULL default 'FFFF77',
`rec_have` int(3) NOT NULL default '0',
`rec_left` int(3) NOT NULL default '0',
`accesslevel` decimal(4,0) default NULL,
`online` decimal(1,0) default NULL,
`onlinetime` decimal(20,0) default NULL,
`char_slot` decimal(1,0) default NULL,
`newbie` decimal(1,0) default '1',
`lastAccess` decimal(20,0) default NULL,
`clan_privs` int(11) default '0',
`wantspeace` decimal(1,0) default '0',
`isin7sdungeon` decimal(1,0) NOT NULL default '0',
`in_jail` decimal(1,0) default '0',
`jail_timer` decimal(20,0) default '0',
`power_grade` decimal(11,0) default NULL,
`nobless` decimal(1,0) NOT NULL default '0',
`subpledge` int(1) NOT NULL default '0',
`last_recom_date` decimal(20,0) NOT NULL default '0',
`lvl_joined_academy` int(1) NOT NULL default '0',
`apprentice` int(1) NOT NULL default '0',
`sponsor` int(1) NOT NULL default '0',
`varka_ketra_ally` int(1) NOT NULL default '0',
`clan_join_expiry_time` decimal(20,0) NOT NULL default '0',
`clan_create_expiry_time` decimal(20,0) NOT NULL default '0',
`lang` varchar(2) character set latin1 default NULL,
`chatban_timer` decimal(20,0) default '0',
`death_penalty_level` int(2) NOT NULL default '0',
`isKillerPlayer` int(11) NOT NULL default '0',
`ban_timer` int(11) NOT NULL default '0',
`hero` decimal(20,0) NOT NULL default '0',
`hero_aura` varchar(45) NOT NULL default '0',
`BanReason` varchar(250) character set latin1 NOT NULL default '0',
`premium` decimal(20,0) NOT NULL default '0',
`chatban_reason` varchar(255) NOT NULL default '',
`chat_filter_count` varchar(45) NOT NULL default '0',
`lastteleport` decimal(20,0) default NULL,
`deaths` decimal(11,0) DEFAULT 0,
PRIMARY KEY (`obj_Id`),
KEY `clanid` (`clanid`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
items.sql
Код: CREATE TABLE `items` (
`owner_id` int(11) default NULL,
`object_id` int(11) NOT NULL default '0',
`item_id` int(11) default NULL,
`count` int(11) default NULL,
`enchant_level` int(11) default NULL,
`aug_id` int(11) NOT NULL default '-1',
`aug_skill` int(11) NOT NULL default '-1',
`aug_lvl` int(11) NOT NULL default '-1',
`loc` enum('VOID','INVENTORY','PAPERDOLL','WAREHOUSE','CLANWH','PET','PET_EQUIP','LEASE','FREIGHT') NOT NULL,
`loc_data` int(11) default NULL,
`price_sell` int(11) default NULL,
`price_buy` int(11) default NULL,
`time_of_use` int(11) default NULL,
`custom_type1` int(11) default '0',
`custom_type2` int(11) default '0',
`mana_left` decimal(3,0) NOT NULL default '-1',
`end_time` varchar(45) NOT NULL default '0',
PRIMARY KEY (`object_id`),
KEY `key_owner_id` (`owner_id`),
KEY `key_loc` (`loc`),
KEY `key_item_id` (`item_id`),
KEY `key_time_of_use` (`time_of_use`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
Собственно сюда суть такова, мне нужно предмет с ID 25005 добавить всем персонажам.
Буду благодарен за помощь.
Сообщений: 1,240
Тем: 29
Зарегистрирован: May 2013
Репутация:
2,505
А что вам мешает это сделать через ядро? К тому же в ядре взять новый (следующий) номер объекта куда проще чем городить костыли.
Родился, живу и когда-нибудь умру.
|