Правильный запрос 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 шт):

Автор решения: S.H.

Дополнение

Автор вопроса сделал такое уточнение: "Потом умножить их уровни на 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'ами устанавливать прежний уровень персоонажей.

Но если у Вас в процессе накатывания патчика происходит уничтоже ние старой таблицы и создание новой - при этом, конечно, данные будут удалены. Но такого не должно быть - ну, кто же делает такие патчи?

Осталось разобраться, чем "старая" таблица отличается от "новой". Если это не написано в явном виде - можно просто поставить эксперимент: не на боевом, а на тестовом сервере сделать "патч обновления" любым способом, и потом сравнить получившиеся таблицы.

→ Ссылка