Перейти к содержимому
Открыть в приложении

Удобный способ просмотра. Узнать больше.

Дизайн и модификация Invision Community

Полноэкранное приложение на главном экране с push-уведомлениями, медалями и многим другим.

Чтобы установить это приложение на iOS и iPadOS
  1. Нажмите иконку «Поделиться» в Safari
  2. Прокрутите меню и нажмите На экран «Домой».
  3. Нажмите Добавить в правом верхнем углу.
Чтобы установить это приложение на Android
  1. Нажмите меню из трёх точек (⋮) в правом верхнем углу браузера.
  2. Нажмите Добавить на главный экран или Установить приложение.
  3. Подтвердите, нажав Установить.
Русский язык для Invision Community 5

Помогите с SQL запросом банами/разбанами

Здравствуйте. У меня есть игровой сервер, который в случае бана игрока записывает данные в базу данных таблицу stats_bans. Создан таск для разбана, который удаляет бан с выше упомянутой таблицы и переносит его в таблицу stats_banhistory.

 

Есть конфликт, который нужно решить. Пи переносе всех банов со stats_bans сбрасывается автоинкримент (на сколько я понял) и уже новые баны идут в ID 1, возникает конфликт с таблицей stats_banhistory, так как там уже есть бан с ID 1. Как быть?

 

Блин, закончилась квота на загрузку скринов, буду на внешний сервис грузить:

http://prntscr.com/kpzflw

http://prntscr.com/kpzfhn

http://prntscr.com/kpzfr2

 

Пришла сейчас мысль, может при выполнении таска выбирать кол-во записей из banhistory и обновлять автоинкримент по нему у bans?

archiveBans.php

Изменено пользователем TemKa_SD

Рекомендованные сообщения

А зачем вы комируете ид из одной таблицу в другую? Они между собой связаны? Кто вам делал этот скрипт с банами на форуме?

  • Автор

А зачем вы комируете ид из одной таблицу в другую? Они между собой связаны? Кто вам делал этот скрипт с банами на форуме?

 

Да, связаны, там есть раздел "Амнистии" - обжалование бана, там сравнение идет по ID. Автор https://invisioncommunity.com/profile/546002-griefcode/ он щас всё это дело делает на symfony там и интеграция с IPS будет https://git.ohsystem.net/projects/OHS/repos/ohstatsv2/browse, но он как отдельный двиг, а я хочу в виде компонента для IPS, поэтому сам пытаюсь что-то сделать.

Изменено пользователем TemKa_SD

Если таблицы между собой связаны тогда они должны быть синхронизированы, и тот кто делает изменения в одной таблицы учитывал совместимость с другой, в противном случае возможны такие коллизии когда инсерт в таблицах происходит независимо а при копирование данных ид пересекаются. На форуме редко применяется запрос TRUNCATE TABLE для обнуления автоинкремента.

  • Автор

так?

 

ALTER TABLE `stats_banhistory`
 ADD PRIMARY KEY (`id`),
 ADD UNIQUE (`id`);

ALTER TABLE `stats_bans`
 ADD KEY `name` (`name`),
 ADD KEY `ip` (`ip`),
 ADD KEY `srv` (`server`),
 ADD KEY `name_2` (`name`,`server`,`ip`),
 ADD INDEX ( `id` );

ALTER TABLE `stats_bans` ADD FOREIGN KEY ( `id` ) REFERENCES `stats_banhistory` (`id`) ON DELETE RESTRICT ON UPDATE RESTRICT;

  • Автор

Что-то не то.

 

[Thu Sep 13 02:26:05 2018] [GAME: PETRI BALANCE #91] admin [TemKa_SD] sent command [pban] with payload [this]

[Thu Sep 13 02:26:05 2018] [MYSQL] error --- Cannot add or update a child row: a foreign key constraint fails (`wc3_ghost`.`stats_bans`, CONSTRAINT `stats_bans_ibfk_1` FOREIGN KEY (`id`) REFERENCES `stats_banhistory` (`id`))

Я бы не стал связываться с внешними ключами, а именно в коде где происходит обновления одной таблицы учитвал связь с другой и не записывать левые строки. В banhistory никто не должен ничего записывать кроме записей из основной таблицы. При копирование по задаче вы должны отбирать из основной таблицы те записи которые не существуют в архиве.

Вы уверены что условием expired

При дублирующих ид можно использовать ON DUPLICATE KEY UPDATE вместо простого INSERT. Тогда пересекающиеся записи будут перезаписаны.

Я думаю проблема у вас в логике, вы отбираете уже имеющиеся записи.

Создайте аккаунт или войдите в него для комментирования

Аккаунт

Навигация

Поиск

Поиск

Настроить push-уведомления браузера

Chrome (Android)
  1. Нажмите на иконку замка рядом с адресной строкой.
  2. Нажмите Права доступа -> Уведомления.
  3. Измените свои настройки.
Chrome (компьютер)
  1. Нажмите на иконку замка в адресной строке.
  2. Выберите Настройки сайта.
  3. Найдите Уведомления и измените свои настройки.