Re: сенсорная фаланга версия 32a7
Добавлено: 24 ноя 2011, 21:12
Да-да. Просто форсировать последнее обновление - это слишком сложно для цирка. Надо шаманить. Понимаю.
Супернова / Сверхновая - Форумы
https://forum.supernova.ws/
Код: Выделить всё
Обновление сервера.
Altering error for table `users`: Can't create table './x20/#sql-faa_1c413b.frm' (errno: 121)
array(2)
0 => string(126) ADD∴CONSTRAINT∴`FK_users_ally_id`∴FOREIGN∴KEY∴(`ally_id`)∴REFERENCES∴`sn_alliance`∴(`id`)∴ON∴DELETE∴SET∴NULL∴ON∴UPDATE∴CASCADE
1 => string(137) ADD∴CONSTRAINT∴`FK_users_ally_name`∴FOREIGN∴KEY∴(`ally_name`)∴REFERENCES∴`sn_alliance`∴(`ally_name`)∴ON∴DELETE∴SET∴NULL∴ON∴UPDATE∴CASCADE
Код: Выделить всё
Обновление сервера.
Altering error for table `users`: Can't create table './x20/#sql-faa_1c41c5.frm' (errno: 121)
array(1)
0 => string(134) ADD∴CONSTRAINT∴`FK_users_ally_tag`∴FOREIGN∴KEY∴(`ally_tag`)∴REFERENCES∴`sn_alliance`∴(`ally_tag`)∴ON∴DELETE∴SET∴NULL∴ON∴UPD
Все выполнил через phpmyadmin, ошибок нет, но это не помогло. Снова при обновлении статы вылазиет:killer писал(а):прошу прощения,ступил....DarkKnight писал(а):Это файл из 32а7.killer писал(а): скинь файл: includes/functions/sys_stat_functions.php
похоже в нём проблема
решением думаю будет следующее:
Выполните запрос в бд:В общем проблема из-за таблицы бд...Код: Выделить всё
DROP TABLE IF EXISTS `sn_statpoints`; CREATE TABLE `sn_statpoints` ( `id_owner` int(11) NOT NULL DEFAULT '0', `id_ally` int(11) NOT NULL DEFAULT '0', `stat_type` int(2) NOT NULL DEFAULT '0', `stat_code` int(11) NOT NULL DEFAULT '0', `tech_rank` int(11) NOT NULL DEFAULT '0', `tech_old_rank` int(11) NOT NULL DEFAULT '0', `tech_points` bigint(20) NOT NULL DEFAULT '0', `tech_count` int(11) NOT NULL DEFAULT '0', `build_rank` int(11) NOT NULL DEFAULT '0', `build_old_rank` int(11) NOT NULL DEFAULT '0', `build_points` bigint(20) NOT NULL DEFAULT '0', `build_count` int(11) NOT NULL DEFAULT '0', `defs_rank` int(11) NOT NULL DEFAULT '0', `defs_old_rank` int(11) NOT NULL DEFAULT '0', `defs_points` bigint(20) NOT NULL DEFAULT '0', `defs_count` int(11) NOT NULL DEFAULT '0', `fleet_rank` int(11) NOT NULL DEFAULT '0', `fleet_old_rank` int(11) NOT NULL DEFAULT '0', `fleet_points` bigint(20) NOT NULL DEFAULT '0', `fleet_count` int(11) NOT NULL DEFAULT '0', `total_rank` int(11) NOT NULL DEFAULT '0', `total_old_rank` int(11) NOT NULL DEFAULT '0', `total_points` bigint(20) NOT NULL DEFAULT '0', `total_count` int(11) NOT NULL DEFAULT '0', `stat_date` int(11) NOT NULL DEFAULT '0', `res_rank` int(11) DEFAULT '0' COMMENT 'Rank by resources', `res_old_rank` int(11) DEFAULT '0' COMMENT 'Old rank by resources', `res_points` bigint(20) DEFAULT '0' COMMENT 'Resource stat points', `res_count` bigint(20) DEFAULT '0' COMMENT 'Old rank by resources', KEY `TECH` (`tech_points`), KEY `BUILDS` (`build_points`), KEY `DEFS` (`defs_points`), KEY `FLEET` (`fleet_points`), KEY `TOTAL` (`total_points`), KEY `i_stats_owner` (`id_owner`,`stat_type`,`stat_code`,`tech_rank`,`build_rank`,`defs_rank`,`fleet_rank`,`total_rank`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; UPDATE `sn_config` SET `config_value` = '30' WHERE `sn_config`.`config_name` = 'db_version';
Код: Выделить всё
Адрес страницы /scheduler.php
Тип 500 SQL Error
Текст ошибки
Cannot add or update a child row: a foreign key constraint fails (`x20/sn_statpoints`, CONSTRAINT `FK_stats_id_ally` FOREIGN KEY (`id_ally`) REFERENCES `sn_alliance` (`id`) ON DELETE CASCADE ON UPDATE CASCADE)
INSERT INTO sn_statpoints SET `id_owner` = '2', `id_ally` = '', `stat_type` = '1', `stat_code` = '1', `tech_points` = '15099487.2', `tech_count` = '63', `build_points` = '849287.038608', `build_count` = '129', `defs_points` = '2174189.5', `defs_count` = '592668', `fleet_points` = '18', `fleet_count` = '1', `res_points` = '41574.4679111', `res_count` = '41574467.9111', `total_points` = '18164556.2065', `total_count` = '42167328.9111', `stat_date` = '1322198151';
Отладочная информация
backtrace = array(2)
2 => array(4)
file => string(94) /home/supernova/domains/x20.supernova.uz/public_html/includes/functions/sys_stat_functions.php
line => integer 250
function => string(7) doquery
args => array(1)
0 => string(466) INSERT∴INTO∴{{statpoints}}∴SET∴`id_owner`∴=∴'2',∴`id_ally`∴=∴'',∴`stat_type`∴=∴'1',∴`stat_code`∴=∴'1',∴`tech_points`∴=∴'15099487.2',∴`tech_count`∴=∴'63',∴`build_points`∴=∴'849287.038608',∴`build_count`∴=∴'129',∴`defs_points`∴=∴'2174189.5',∴`defs_count`∴=∴'592668',∴`fleet_points`∴=∴'18',∴`fleet_count`∴=∴'1',∴`res_points`∴=∴'41574.4679111',∴`res_count`∴=∴'41574467.9111',∴`total_points`∴=∴'18164556.2065',∴`total_count`∴=∴'42167328.9111',∴`stat_date`∴=∴'1322198151';
3 => array(4)
file => string(66) /home/supernova/domains/x20.supernova.uz/public_html/scheduler.php
line => integer 54
function => string(17) SYS_statCalculate
args => array(0)
Вот поэтому и не меняются тэги/названия альянсов при переименовании. Какая-то рассинхронизация в структуре/данных таблицы. Какие - сказать невозможно, нужно смотреть по месту. Погугли - в инете полно инфы по этому поводу.DarkKnight писал(а):Форсировать обновление с нуляПовторить предыдущее обновлениеКод: Выделить всё
Обновление сервера. Altering error for table `users`: Can't create table './x20/#sql-faa_1c413b.frm' (errno: 121) array(2) 0 => string(126) ADD∴CONSTRAINT∴`FK_users_ally_id`∴FOREIGN∴KEY∴(`ally_id`)∴REFERENCES∴`sn_alliance`∴(`id`)∴ON∴DELETE∴SET∴NULL∴ON∴UPDATE∴CASCADE 1 => string(137) ADD∴CONSTRAINT∴`FK_users_ally_name`∴FOREIGN∴KEY∴(`ally_name`)∴REFERENCES∴`sn_alliance`∴(`ally_name`)∴ON∴DELETE∴SET∴NULL∴ON∴UPDATE∴CASCADE
Код: Выделить всё
Обновление сервера. Altering error for table `users`: Can't create table './x20/#sql-faa_1c41c5.frm' (errno: 121) array(1) 0 => string(134) ADD∴CONSTRAINT∴`FK_users_ally_tag`∴FOREIGN∴KEY∴(`ally_tag`)∴REFERENCES∴`sn_alliance`∴(`ally_tag`)∴ON∴DELETE∴SET∴NULL∴ON∴UPD
Gorlum писал(а):Решение проблемы с констраинтами на примере таблицы users и поля ally_tag
Нам нужно добавить вот такой constraint:Он связывает поле ally_tag таблицы users (подчиненная) с полем ally_tag таблицы alliance (главная). Когда поле ally_tag изменяется в таблице alliance, то связанное поле автоматически изменяется в таблице users. Если запись удаляется из таблицы users - поле ally_tag d соответствующей записи удаляется из таблицы users.Код: Выделить всё
ADD CONSTRAINT `FK_users_ally_tag` FOREIGN KEY (`ally_tag`) REFERENCES `{$config->db_prefix}alliance` (`ally_tag`) ON DELETE SET NULL ON UPDATE CASCADE
Что бы можно было сделать такую связь, нужна логическая целостность обоих таблиц. Это означает, чтоСобственно, апдейтер сам делает все нужные изменения. НО ТОЛЬКО если ранее все апдейты проходили нормально! Если, например, ранее сбился constraint на ally_id, то апдейтер НЕ СМОЖЕТ нормально отработать constraint на ally_tag.
- Типы и кодировка связываемых полей должны совпадать.
- В подчиненной таблице в свойствах поля должно стоять DEFAULT NULL
- Для всех связываемых полей должны существовать индексы во всех используемых таблицах
- На момент связывания в подчиненной таблице НЕ ДОЛЖНО быть таких значений в связываемом поле, которых нет в главной таблице. В нашем случае (самый сложный) нужно: во-первых обновить все значения ally_tag до текущих
во-вторых - для тех записей, для которых Альянсы не существуют, установить соответствующее поле в NULLКод: Выделить всё
doquery("UPDATE {{users}} AS u LEFT JOIN {{alliance}} AS a ON a.id = u.ally_id SET u.ally_tag = a.ally_tag;");
Код: Выделить всё
doquery("UPDATE {{users}} AS u LEFT JOIN {{alliance}} AS a ON a.id = u.ally_id SET u.ally_id = NULL, u.ally_tag = NULL WHERE a.id is NULL;");
- Если бы в constraint стояло бы ON DELETE CASCADE, а не ON DELETE SET NULL, то нужно было бы просто удалить из подчиненной таблицы все записи, для которых нет соответствия в главной таблице. На примере constraint для таблицы shortcut:
соответствующий запрос:Код: Выделить всё
ADD CONSTRAINT `FK_shortcut_planet_id` FOREIGN KEY (`shortcut_planet_id`) REFERENCES `{$config->db_prefix}planets` (`id`) ON DELETE CASCADE ON UPDATE CASCADE
Код: Выделить всё
doquery('DELETE FROM {{shortcut}} WHERE shortcut_planet_id NOT IN (SELECT id FROM {{planets}});');
- ??????
- PROFIT!
Мануал для курения:
http://dev.mysql.com/doc/refman/5.5/en/ ... aints.html
И совсем продвинутый мануал:
http://dev.mysql.com/doc/refman/5.5/en/constraints.html
Ты читал вообще то, что я написал? Проблема - не в таблице Альянсов (главная таблица), а в таблице users (подчиненная таблица). Нужно обработать таблицу users, что бы поле ally_tag не содержало значений, которых нет в таблице alliances. Как вариант - можешь дропнуть все поля, относящиеся к Альянсам в таблице пользователей (ally_*) и создать их заново.DarkKnight писал(а):А если я например очищу полностью таблицу альянсов и заново будем регать, проблема решится?
Ну и сделаю ADD CONSTRAINT `FK_users_ally_tag` FOREIGN KEY (`ally_tag`) REFERENCES `{$config->db_prefix}alliance` (`ally_tag`) ON DELETE SET NULL ON UPDATE CASCADE
Народ, но это же элементарнейшие вещи по SQL! Чем несколько дней фигней страдать - могли бы за пол-часа найти ошибку в гугле и прочитать все то же самое в инете! И сами все поправить.killer писал(а):Gorlum, спасибо за инфу