Правильный запрос MySQL Oracle
У меня есть сервер работающий с базой данных MySQL Oracle. Локальный хост установлен прямо на машине. Я сделал патч обновления, где уже у персонажей пресутсвуют способности. За каждое повышение уровней, дается по два очка способностей, которые Вы можете вложить в одну из способностей.
Проблема заключается в том, что есть уже персонажи довольно высокого уровня. И публично сказать им что они будут прокачиваться заново - не есть хорошо) Есть ли способ сделать как-то запрос в MySQL, чтобы через UPDATE взять и установить нужное значение очков способностей? К примеру, у персонажа 14 уровень: 14 * 2 = 28 очков способностей начисляется в поле персонажу такому-то.
DROP TABLE IF EXISTS `characters`;
CREATE TABLE `characters` (
`account_name` varchar(45) DEFAULT NULL,
`obj_Id` int(10) unsigned NOT NULL DEFAULT '0',
`char_name` varchar(35) NOT NULL,
`level` tinyint(3) unsigned DEFAULT NULL,
`maxHp` mediumint(8) unsigned DEFAULT NULL,
`curHp` mediumint(8) unsigned DEFAULT NULL,
`maxMp` mediumint(8) unsigned DEFAULT NULL,
`curMp` mediumint(8) unsigned DEFAULT NULL,
`face` tinyint(3) unsigned DEFAULT NULL,
`hairStyle` tinyint(3) unsigned DEFAULT NULL,
`hairColor` tinyint(3) unsigned DEFAULT NULL,
`sex` tinyint(3) unsigned DEFAULT NULL,
`heading` mediumint(9) DEFAULT NULL,
`x` mediumint(9) DEFAULT NULL,
`y` mediumint(9) DEFAULT NULL,
`z` mediumint(9) DEFAULT NULL,
`exp` bigint(20) unsigned DEFAULT '0',
`karma` int(10) unsigned DEFAULT NULL,
`pvpkills` smallint(5) unsigned DEFAULT NULL,
`classid` tinyint(3) unsigned DEFAULT NULL,
`base_class` tinyint(3) unsigned NOT NULL DEFAULT '0',
`deletetime` bigint(20) DEFAULT NULL,
`title` varchar(16) DEFAULT NULL,
`accesslevel` mediumint(9) DEFAULT '0',
`online` tinyint(3) unsigned DEFAULT NULL,
`onlinetime` int(11) DEFAULT NULL,
`char_slot` tinyint(3) unsigned DEFAULT NULL,
`lastAccess` bigint(20) unsigned DEFAULT NULL,
`skill_points` tinyint(3) unsigned DEFAULT NULL,
PRIMARY KEY (`obj_Id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
Ответы (1 шт):
Дополнение
Автор вопроса сделал такое уточнение: "Потом умножить их уровни на 2 и мы получим очки способностей. И обновить через Update таблицу". В такой формулировке вопрос-довольно простой. Пусть ulevel - это уровень, upoints - это очки способностей.
Тогда запрос Update characters set upoints=ulevels*2; как раз сделает нужное.
Я прочитал вопрос и список комментариев к нему.
По моему, сам подход у Вас - ведёт к проблемам для существующих игроков.
Давайте попробуем разобраться.
"Я сделал патч обновления"
А как Вы его сделали?
Информации очень мало, но, как Вы пишете - "где уже у персонажей присутсвуют способности"
С точки зрения базы данных - это добавление дополнительных полей в таблицу.
Ну, то есть, был персонаж. У него были такие то и такие то характеристики.
Потом ему добавились еще и "способности".
Это - новая сущность. Соответственно, она хранится либо в отдельной таблице, которая как то связана с существующими данными, либо - она хранится вместе с существующими данными, в отдельных дополнительных полях.
Учитывая всё это, мне кажется, если правильно сделать обновление - то у всех персонажей сохранятся все их характеристики, и просто добавятся новые.
И тут мы подходим к главному вопросу: как это сделать?
В общем, нужно понять, что происходит при обновлении.
В современных фреймворках обновления базы данных называются "миграциями". "Миграция", если убрать щепотку магической составляющей из этого названия - это SQL скрипт, описывающий переход базы данных из "состояния 1" в "состояние 2" и обратно. Благодаря последнему слову - миграцию можно "накатить" и "откатить". При этом старые данные - не страдают, остаются на месте.
У Вас, скорее всего, если разобраться, частью процесса обновления является обновление базы данных. При этом, скорее всего, в таблицу характеристик персоонажа просто должны добавиться поля. Для этого в SQL обычно используется команда ALTER TABLE, например,
ALTER TABLE `characters` ADD `base_class` tinyint(3) unsigned NOT NULL DEFAULT '0'
Это выражение описывает добавление в существующую таблицу одного единственного поля, без изменения данных в других полях
При таком подходе Вам не нужно будет заново как то UPDATE'ами устанавливать прежний уровень персоонажей.
Но если у Вас в процессе накатывания патчика происходит уничтоже ние старой таблицы и создание новой - при этом, конечно, данные будут удалены. Но такого не должно быть - ну, кто же делает такие патчи?
Осталось разобраться, чем "старая" таблица отличается от "новой". Если это не написано в явном виде - можно просто поставить эксперимент: не на боевом, а на тестовом сервере сделать "патч обновления" любым способом, и потом сравнить получившиеся таблицы.