MySQL (F.A.Q.)

Quote:
Фракция
  • id
  • name
Игрок
  • id
  • name
Ранг
  • id
  • name
Члены
  • id игрока
  • id фракции
  • дата вступления в фракцию
  • дата выхода из фракции
Ранги
  • id игрока
  • id ранга
  • дата получения ранга
  • дата потери ранга
  • Причина потери
Не благодари.
Reply

Quote:
Originally Posted by Stepashka
View Post
Не благодари.
А теперь учи вложенным запросам
Reply

Quote:
Originally Posted by White_116
View Post
А теперь учи вложенным запросам
Тут JOIN запросов вполне достаточно.
Reply

Часто происходит потеря сигнала с базой.
Стоит OpenServer на Windows 7, это нормально для этой сборки или же можно что-то подкрутить в настройках, кто работает на этой сборке подскажите пожалуйста.
Reply

Quote:
Originally Posted by themakar
View Post
Часто происходит потеря сигнала с базой.
Стоит OpenServer на Windows 7, это нормально для этой сборки или же можно что-то подкрутить в настройках, кто работает на этой сборке подскажите пожалуйста.
Попробуй увеличить таймаут ожидания в настройках базы.
Reply

Quote:
Originally Posted by Stepashka
View Post
Попробуй увеличить таймаут ожидания в настройках базы.
wait_timeout = 60
interactive_timeout = 30
Reply

Всем привет!
Имеются 2 таблицы:
Accounts: id | name | pass | chars
Characters: id | from | name | level
Вопрос: Как лучше привязать к аккаунту персонаж?
Путём имя аккаунта с полей "from"? String
Или путём id аккаунта с полей "from"? Int
И на последок, как привязать эти поля к друг другу? На примере пожалуйста.
Reply

Quote:
Originally Posted by themakar
View Post
wait_timeout = 60
interactive_timeout = 30
Очевидно эти. Если не поможет, веди логи и ищи причину дисконектов.

Quote:
Originally Posted by Davidoff
View Post
Всем привет!
Имеются 2 таблицы:
Accounts: id | name | pass | chars
Characters: id | from | name | level
Вопрос: Как лучше привязать к аккаунту персонаж?
Путём имя аккаунта с полей "from"? String
Или путём id аккаунта с полей "from"? Int
И на последок, как привязать эти поля к друг другу? На примере пожалуйста.
По средствам уникального поля.
Второе.
Скриптово, можно конечно прописать зависимости в базе, но ты больше с ними намучаешься чем они тебе помогут.
Reply

Quote:
Originally Posted by Stepashka
View Post
Очевидно эти. Если не поможет, веди логи и ищи причину дисконектов.

По средствам уникального поля.
Второе.
Скриптово, можно конечно прописать зависимости в базе, но ты больше с ними намучаешься чем они тебе помогут.
Как это сделать? покажите пример пожалуйста.
Reply

Quote:
Originally Posted by Davidoff
View Post
Как это сделать? покажите пример пожалуйста.
В Characters добавить поле account_id, которое будет хранить значение id из accounts (т.е. какому аккаунту принадлежит персонаж). Потом можно будет выбирать персонажей так:

SELECT * FROM characters WHERE account_id = (SELECT id FROM accounts WHERE name="Davidoff")
Reply

Quote:
Originally Posted by Davidoff
Посмотреть сообщение
Всем привет!
Имеются 2 таблицы:
Accounts: id | name | pass | chars
Characters: id | from | name | level
Вопрос: Как лучше привязать к аккаунту персонаж?
Путём имя аккаунта с полей "from"? String
Или путём id аккаунта с полей "from"? Int
И на последок, как привязать эти поля к друг другу? На примере пожалуйста.
Уточните, в какой базе они имеются.
Полагаю, речь идет о MySQL, и о движке MyISAM, который используется чаще всего (если не ошибаюсь, по умолчанию).
Реляционные СУБД как раз и были разработаны для таких задач.

Отвечу кратко - добавьте внешний уникальный ключ в таблицу Characters на Accounts.id
PHP код:
ALTER TABLE `Characters`  # Изменить таблицу Characters
ADD COLUMN `accountINT(11NULL# Добавить поле 'account' (должно иметь тот же тип данных, что и Accounts.id), NULL значит "разрешить использовать пустое значение" (в вашем случае это значит "персонажам могут быть не назначены аккаунты" - полезно, например, при передаче аккаунта, но если вы это делать не планируете, напишите NOT NULL)
ADD UNIQUE INDEX `account` (`account`), # Добавить уникальный индекс 'account' на одноименное поле. Это не позволит добавить в таблицу две записи с одинаковой ссылкой на аккаунт (акканут не сможет иметь больше 1 персонажа). Если вы хотите дать возможность игрокам создавать несколько персонажей на один аккаунт, не пишите эту строку
ADD CONSTRAINT `fk_account_characterFOREIGN KEY (`account`) REFERENCES `Accounts` (`id`) ON UPDATE CASCADE ON DELETE CASCADE# Добавить внешний ключ Character.account к Accounts.id, при изменении ID аккаунта - изменять соответственно Character.account, при удалении аккаунта соответственно удалять персонажей аккаунта 
Не слушайте тех, кто утверждает, будто связи в базе данных вам только головную боль добавят. Все как раз наоборот. Связи позволяют держать базу в целом виде - вы будете уверены в том, что аккаунты не ссылаются на несуществующих персонажей. Также обратите внимание на ON UPDATE и ON DELETE - в примере выше, если удалить запись из Accounts, все связанные персонажи также будут удалены - как это применить вы можете решить сами (также можно автоматически установить NULL или запретить удаление аккаунта, если у него есть связанный персонаж), а если ID персонажа изменится, он также изменится во всех связанных таблицах.

Кстати, пример выше должен выглядеть так
PHP код:
SELECT Characters .* 
FROM CharactersAccounts
WHERE Accounts
.name "Davidoff"
AND Characters.account Accounts.id 
Думаю, в Интернете полно информации о всем выше написанном, если чего-то не нашли или не поняли, спрашивайте сюда

P.S> Я ответил на вопрос, в котором нет ничего про скрипты и программы. Скажу еще вот что - использование связей в субд сохраняет целостность базы, и не освобождает от проверок в скриптах игрового мода. Это значит, что вы по-прежнему должны проверять, существуют ли аккаунты, которым вы создаете персонажей и т.п.
Кстати, СуБД со связями между сущностями может вас обругать, но только если ваши скрипты работают неправильно или происходят какие-то сбои. Поверьте, лучше один раз увидеть ошибку и не создать новому игроку персонаж, чем через полгода обнаружить сотни аккаунтов без персонажей или, что еще хуже, с одинаковыми ID персонажей
Reply

Спасибо большое за ответы!
Reply

Можно как то запретить вносить в таблицу новые строки на стороне sql сервера?
Допустим я хочу иметь в таблице максимум 144 строки
Reply

Quote:
Originally Posted by themakar
Посмотреть сообщение
Можно как то запретить вносить в таблицу новые строки на стороне sql сервера?
Допустим я хочу иметь в таблице максимум 144 строки
Код:
ALTER TABLE table MAX_ROWS=144
Reply

В таблице table возможны 'NULL'-значения у некоторых колонок.
Как преобразовать все получаемые значения из 'NULL' в '0' (нуль) в таком запросе?
Код:
SELECT t.* FROM table t
Нужно что-то наподобие этого, но чтобы работало с t.*
Код:
SELECT COALESCE(t.field,0) FROM table t
Reply

Код:
SELECT IFNULL(t.field, 0) FROM table t
Reply

Quote:
Originally Posted by Stepashka
Посмотреть сообщение
Код:
SELECT IFNULL(t.field, 0) FROM table t
Это не то. Я имел в виду что-то вроде этого, но такое использование приводит к ошибке:
Код:
SELECT IFNULL(t.*,0) FROM table t
Reply

Quote:
Originally Posted by ea8de1
Посмотреть сообщение
Это не то. Я имел в виду что-то вроде этого, но такое использование приводит к ошибке:
Код:
SELECT IFNULL(t.*,0) FROM table t
Только перечислять каждое поле. Или запрещать нуль при создании таблицы.
Reply

Quote:
Originally Posted by Stepashka
Посмотреть сообщение
Только перечислять каждое поле. Или запрещать нуль при создании таблицы.
Жаль(
Reply

PHP код:
SELECT `dataFROM `users`WHERE `user_id` = '1' 
поле data типа blob, что вернет мне этот запрос, спрашиваю на будущие, проверить самому пока нет возможности.
Reply


Forum Jump:


Users browsing this thread: 12 Guest(s)