Перейти к публикации
View in the app

A better way to browse. Learn more.

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

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

Помогите с 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. Тогда пересекающиеся записи будут перезаписаны.

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

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

Сейчас на странице 0

  • Нет пользователей, просматривающих эту страницу.

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.