HOW TO MANUALLY UPDATE YOUR TABLES!
You custom server creators, you...
Ok, now that all your tables are consistent and there should be no errors creating constraints, here's how you can do it and preserve your data (ie., no DROP table, CREATE table). Again, this is only for those who wish to preserve their data! The rest of you, drop your DB and start over
First, in order for constraints/foreign keys to work at all on MySQL, the table engine must be INNODB - which hopefully yours should be by getting the table modifications from us. If you do not allow us to mod your tables, here's the command:
Code: Select all
ALTER TABLE `characters` ENGINE=INNODB;
You have to do that for every table that shows as Engine = MyISAM. Here's the full script I used:
Code: Select all
ALTER TABLE `appearances` ENGINE=INNODB CHECKSUM=1 AUTO_INCREMENT=1 DELAY_KEY_WRITE=1 ROW_FORMAT=DYNAMIC CHARSET=latin1 COLLATE=latin1_swedish_ci;
ALTER TABLE `bugs` ENGINE=INNODB CHECKSUM=1 AUTO_INCREMENT=1 DELAY_KEY_WRITE=1 ROW_FORMAT=DYNAMIC CHARSET=latin1 COLLATE=latin1_swedish_ci;
ALTER TABLE `characters` ENGINE=INNODB CHECKSUM=1 AUTO_INCREMENT=1 DELAY_KEY_WRITE=1 ROW_FORMAT=DYNAMIC CHARSET=latin1 COLLATE=latin1_swedish_ci;
ALTER TABLE `char_colors` ENGINE=INNODB CHECKSUM=1 AUTO_INCREMENT=1 DELAY_KEY_WRITE=1 ROW_FORMAT=DYNAMIC CHARSET=latin1 COLLATE=latin1_swedish_ci;
ALTER TABLE `character_access` ENGINE=INNODB CHECKSUM=1 AUTO_INCREMENT=1 DELAY_KEY_WRITE=1 ROW_FORMAT=DYNAMIC CHARSET=latin1 COLLATE=latin1_swedish_ci;
ALTER TABLE `character_details` ENGINE=INNODB CHECKSUM=1 AUTO_INCREMENT=1 DELAY_KEY_WRITE=1 ROW_FORMAT=DYNAMIC CHARSET=latin1 COLLATE=latin1_swedish_ci;
ALTER TABLE `character_factions` ENGINE=INNODB CHECKSUM=1 AUTO_INCREMENT=1 DELAY_KEY_WRITE=1 ROW_FORMAT=DYNAMIC CHARSET=latin1 COLLATE=latin1_swedish_ci;
ALTER TABLE `character_friendlist` ENGINE=INNODB CHECKSUM=1 AUTO_INCREMENT=1 DELAY_KEY_WRITE=1 ROW_FORMAT=DYNAMIC CHARSET=latin1 COLLATE=latin1_swedish_ci;
ALTER TABLE `character_items` ENGINE=INNODB CHECKSUM=1 AUTO_INCREMENT=1 DELAY_KEY_WRITE=1 ROW_FORMAT=DYNAMIC CHARSET=latin1 COLLATE=latin1_swedish_ci;
ALTER TABLE `character_language` ENGINE=INNODB CHECKSUM=1 AUTO_INCREMENT=1 DELAY_KEY_WRITE=1 ROW_FORMAT=DYNAMIC CHARSET=latin1 COLLATE=latin1_swedish_ci;
ALTER TABLE `character_macros` ENGINE=INNODB CHECKSUM=1 AUTO_INCREMENT=1 DELAY_KEY_WRITE=1 ROW_FORMAT=DYNAMIC CHARSET=latin1 COLLATE=latin1_swedish_ci;
ALTER TABLE `character_skillbar` ENGINE=INNODB CHECKSUM=1 AUTO_INCREMENT=1 DELAY_KEY_WRITE=1 ROW_FORMAT=DYNAMIC CHARSET=latin1 COLLATE=latin1_swedish_ci;
ALTER TABLE `character_skills` ENGINE=INNODB CHECKSUM=1 AUTO_INCREMENT=1 DELAY_KEY_WRITE=1 ROW_FORMAT=DYNAMIC CHARSET=latin1 COLLATE=latin1_swedish_ci;
ALTER TABLE `character_spells` ENGINE=INNODB CHECKSUM=1 AUTO_INCREMENT=1 DELAY_KEY_WRITE=1 ROW_FORMAT=DYNAMIC CHARSET=latin1 COLLATE=latin1_swedish_ci;
ALTER TABLE `commands` ENGINE=INNODB CHECKSUM=1 AUTO_INCREMENT=1 DELAY_KEY_WRITE=1 ROW_FORMAT=DYNAMIC CHARSET=latin1 COLLATE=latin1_swedish_ci;
ALTER TABLE `entity_commands` ENGINE=INNODB CHECKSUM=1 AUTO_INCREMENT=1 DELAY_KEY_WRITE=1 ROW_FORMAT=DYNAMIC CHARSET=latin1 COLLATE=latin1_swedish_ci;
ALTER TABLE `factions` ENGINE=INNODB CHECKSUM=1 AUTO_INCREMENT=1 DELAY_KEY_WRITE=1 ROW_FORMAT=DYNAMIC CHARSET=latin1 COLLATE=latin1_swedish_ci;
ALTER TABLE `item_appearances` ENGINE=INNODB CHECKSUM=1 AUTO_INCREMENT=1 DELAY_KEY_WRITE=1 ROW_FORMAT=DYNAMIC CHARSET=latin1 COLLATE=latin1_swedish_ci;
ALTER TABLE `item_details_armor` ENGINE=INNODB CHECKSUM=1 AUTO_INCREMENT=1 DELAY_KEY_WRITE=1 ROW_FORMAT=DYNAMIC CHARSET=latin1 COLLATE=latin1_swedish_ci;
ALTER TABLE `item_details_bag` ENGINE=INNODB CHECKSUM=1 AUTO_INCREMENT=1 DELAY_KEY_WRITE=1 ROW_FORMAT=DYNAMIC CHARSET=latin1 COLLATE=latin1_swedish_ci;
ALTER TABLE `item_details_food` ENGINE=INNODB CHECKSUM=1 AUTO_INCREMENT=1 DELAY_KEY_WRITE=1 ROW_FORMAT=DYNAMIC CHARSET=latin1 COLLATE=latin1_swedish_ci;
ALTER TABLE `item_details_range` ENGINE=INNODB CHECKSUM=1 AUTO_INCREMENT=1 DELAY_KEY_WRITE=1 ROW_FORMAT=DYNAMIC CHARSET=latin1 COLLATE=latin1_swedish_ci;
ALTER TABLE `item_details_weapon` ENGINE=INNODB CHECKSUM=1 AUTO_INCREMENT=1 DELAY_KEY_WRITE=1 ROW_FORMAT=DYNAMIC CHARSET=latin1 COLLATE=latin1_swedish_ci;
ALTER TABLE `item_effects` ENGINE=INNODB CHECKSUM=1 AUTO_INCREMENT=1 DELAY_KEY_WRITE=1 ROW_FORMAT=DYNAMIC CHARSET=latin1 COLLATE=latin1_swedish_ci;
ALTER TABLE `item_stats` ENGINE=INNODB CHECKSUM=1 AUTO_INCREMENT=1 DELAY_KEY_WRITE=1 ROW_FORMAT=DYNAMIC CHARSET=latin1 COLLATE=latin1_swedish_ci;
ALTER TABLE `languages` ENGINE=INNODB CHECKSUM=1 AUTO_INCREMENT=1 DELAY_KEY_WRITE=1 ROW_FORMAT=DYNAMIC CHARSET=latin1 COLLATE=latin1_swedish_ci;
ALTER TABLE `name_filter` ENGINE=INNODB CHECKSUM=1 AUTO_INCREMENT=1 DELAY_KEY_WRITE=1 ROW_FORMAT=DYNAMIC CHARSET=latin1 COLLATE=latin1_swedish_ci;
ALTER TABLE `opcodes` ENGINE=INNODB CHECKSUM=1 AUTO_INCREMENT=1 DELAY_KEY_WRITE=1 ROW_FORMAT=DYNAMIC CHARSET=latin1 COLLATE=latin1_swedish_ci;
ALTER TABLE `revive_points` ENGINE=INNODB CHECKSUM=1 AUTO_INCREMENT=1 DELAY_KEY_WRITE=1 ROW_FORMAT=DYNAMIC CHARSET=latin1 COLLATE=latin1_swedish_ci;
ALTER TABLE `skills` ENGINE=INNODB CHECKSUM=1 AUTO_INCREMENT=1 DELAY_KEY_WRITE=1 ROW_FORMAT=DYNAMIC CHARSET=latin1 COLLATE=latin1_swedish_ci;
ALTER TABLE `spell_data` ENGINE=INNODB CHECKSUM=1 AUTO_INCREMENT=1 DELAY_KEY_WRITE=1 ROW_FORMAT=DYNAMIC CHARSET=latin1 COLLATE=latin1_swedish_ci;
ALTER TABLE `spell_display_effects` ENGINE=INNODB CHECKSUM=1 AUTO_INCREMENT=1 DELAY_KEY_WRITE=1 ROW_FORMAT=DYNAMIC CHARSET=latin1 COLLATE=latin1_swedish_ci;
ALTER TABLE `spells` ENGINE=INNODB CHECKSUM=1 AUTO_INCREMENT=1 DELAY_KEY_WRITE=1 ROW_FORMAT=DYNAMIC CHARSET=latin1 COLLATE=latin1_swedish_ci;
ALTER TABLE `starting_items` ENGINE=INNODB CHECKSUM=1 AUTO_INCREMENT=1 DELAY_KEY_WRITE=1 ROW_FORMAT=DYNAMIC CHARSET=latin1 COLLATE=latin1_swedish_ci;
ALTER TABLE `starting_skillbar` ENGINE=INNODB CHECKSUM=1 AUTO_INCREMENT=1 DELAY_KEY_WRITE=1 ROW_FORMAT=DYNAMIC CHARSET=latin1 COLLATE=latin1_swedish_ci;
ALTER TABLE `starting_skills` ENGINE=INNODB CHECKSUM=1 AUTO_INCREMENT=1 DELAY_KEY_WRITE=1 ROW_FORMAT=DYNAMIC CHARSET=latin1 COLLATE=latin1_swedish_ci;
ALTER TABLE `starting_spells` ENGINE=INNODB CHECKSUM=1 AUTO_INCREMENT=1 DELAY_KEY_WRITE=1 ROW_FORMAT=DYNAMIC CHARSET=latin1 COLLATE=latin1_swedish_ci;
ALTER TABLE `starting_zones` ENGINE=INNODB CHECKSUM=1 AUTO_INCREMENT=1 DELAY_KEY_WRITE=1 ROW_FORMAT=DYNAMIC CHARSET=latin1 COLLATE=latin1_swedish_ci;
ALTER TABLE `table_versions` ENGINE=INNODB CHECKSUM=1 AUTO_INCREMENT=1 DELAY_KEY_WRITE=1 ROW_FORMAT=DYNAMIC CHARSET=latin1 COLLATE=latin1_swedish_ci;
ALTER TABLE `variables` ENGINE=INNODB CHECKSUM=1 AUTO_INCREMENT=1 DELAY_KEY_WRITE=1 ROW_FORMAT=DYNAMIC CHARSET=latin1 COLLATE=latin1_swedish_ci;
ALTER TABLE `visual_states` ENGINE=INNODB CHECKSUM=1 AUTO_INCREMENT=1 DELAY_KEY_WRITE=1 ROW_FORMAT=DYNAMIC CHARSET=latin1 COLLATE=latin1_swedish_ci;
ALTER TABLE `zones` ENGINE=INNODB CHECKSUM=1 AUTO_INCREMENT=1 DELAY_KEY_WRITE=1 ROW_FORMAT=DYNAMIC CHARSET=latin1 COLLATE=latin1_swedish_ci;
If you re-check your database table list, you should now see every Engine as "InnoDB". If not, change it manually before proceeding.
Let's get the Character-related tables updated with the relationships (constraints/FKs). You will notice some of these have 2 constraints, and I tried to comment so you know what the difference is. ALL character-related tables have `characters` as a parent record. Some tables use other resources, which must also become related.
Code: Select all
ALTER TABLE `char_colors` ADD CONSTRAINT `FK_char_colors` FOREIGN KEY (`char_id`) REFERENCES `characters` (`id`) ON DELETE CASCADE ON UPDATE CASCADE ;
ALTER TABLE `character_buyback` ADD CONSTRAINT `FK_character_buyback` FOREIGN KEY (`char_id`) REFERENCES `characters` (`id`) ON DELETE CASCADE ON UPDATE CASCADE ;
ALTER TABLE `character_details` ADD CONSTRAINT `FK_character_details` FOREIGN KEY (`char_id`) REFERENCES `characters` (`id`) ON DELETE CASCADE ON UPDATE CASCADE ;
ALTER TABLE `character_factions` ADD CONSTRAINT `FK_character_factions` FOREIGN KEY (`char_id`) REFERENCES `characters` (`id`) ON DELETE CASCADE ON UPDATE CASCADE ;
-- if factions.id changes / do not allow faction delete unless no characters have that faction
ALTER TABLE `character_factions` ADD CONSTRAINT `FK_factions` FOREIGN KEY (`faction_id`) REFERENCES `factions` (`id`) ON DELETE CASCADE ON UPDATE CASCADE ;
ALTER TABLE `character_friendlist` ADD CONSTRAINT `FK_character_friendlist` FOREIGN KEY (`char_id`) REFERENCES `characters` (`id`) ON DELETE CASCADE ON UPDATE CASCADE ;
ALTER TABLE `character_items` ADD CONSTRAINT `FK_character_items` FOREIGN KEY (`char_id`) REFERENCES `characters` (`id`) ON DELETE CASCADE ON UPDATE CASCADE ;
-- if items.id changes / do not allow item delete unless no characters have that item
ALTER TABLE `character_items` ADD CONSTRAINT `FK_char_items` FOREIGN KEY (`item_id`) REFERENCES `items` (`id`) ON DELETE CASCADE ON UPDATE CASCADE ;
ALTER TABLE `character_language` ADD CONSTRAINT `FK_character_language` FOREIGN KEY (`char_id`) REFERENCES `characters` (`id`) ON DELETE CASCADE ON UPDATE CASCADE ;
-- if language.id changes / do not allow language delete unless no characters have that language
ALTER TABLE `character_language` ADD CONSTRAINT `FK_languages` FOREIGN KEY (`language_id`) REFERENCES `languages` (`language_id`) ON DELETE CASCADE ON UPDATE CASCADE ;
ALTER TABLE `character_macros` ADD CONSTRAINT `FK_character_macros` FOREIGN KEY (`char_id`) REFERENCES `characters` (`id`) ON DELETE CASCADE ON UPDATE CASCADE ;
ALTER TABLE `character_quest_progress` ADD CONSTRAINT `FK_character_quest_progress` FOREIGN KEY (`char_id`) REFERENCES `characters` (`id`) ON DELETE CASCADE ON UPDATE CASCADE ;
-- if quest.quest_id changes / do not allow quest delete unless no characters have that quest
ALTER TABLE `character_quest_progress` ADD CONSTRAINT `FK_quest_id` FOREIGN KEY (`quest_id`) REFERENCES `quests` (`quest_id`) ON DELETE CASCADE ON UPDATE CASCADE ;
ALTER TABLE `character_quests` ADD CONSTRAINT `FK_character_quests` FOREIGN KEY (`char_id`) REFERENCES `characters` (`id`) ON DELETE CASCADE ON UPDATE CASCADE ;
-- if quest.quest_id changes / do not allow quest delete unless no characters have that quest
ALTER TABLE `character_quests` ADD CONSTRAINT `FK_quest_quests` FOREIGN KEY (`quest_id`) REFERENCES `quests` (`quest_id`) ON DELETE CASCADE ON UPDATE CASCADE ;
ALTER TABLE `character_skillbar` ADD CONSTRAINT `FK_character_skillbar` FOREIGN KEY (`char_id`) REFERENCES `characters` (`id`) ON DELETE CASCADE ON UPDATE CASCADE ;
ALTER TABLE `character_skills` ADD CONSTRAINT `FK_character_skills` FOREIGN KEY (`char_id`) REFERENCES `characters` (`id`) ON DELETE CASCADE ON UPDATE CASCADE ;
ALTER TABLE `character_spells` ADD CONSTRAINT `FK_character_spells` FOREIGN KEY (`char_id`) REFERENCES `characters` (`id`) ON DELETE CASCADE ON UPDATE CASCADE ;
-- if spells.id changes / do not allow spell delete unless no characters have that spell
ALTER TABLE `character_spells` ADD CONSTRAINT `FK_char_spells` FOREIGN KEY (`spell_id`) REFERENCES `spells` (`id`) ON DELETE CASCADE ON UPDATE CASCADE ;
-- if zones.id changes / do not allow zone delete unless no characters exist in that zone
ALTER TABLE `characters` ADD CONSTRAINT `FK_char_zone` FOREIGN KEY (`current_zone_id`) REFERENCES `zones` (`id`) ON DELETE RESTRICT ON UPDATE CASCADE ;
That's it for Characters. Now, when a record from `characters` gets deleted, all associated data for that characters ID (char_id) also gets removed from all other tables - nice and clean.
Server doesn't have to work so hard, and that's the point. Putting the work on MySQL.
Moving on, we have Items:
Code: Select all
ALTER TABLE `item_appearances` ADD CONSTRAINT `FK_item_appearances` FOREIGN KEY (`item_id`) REFERENCES `items` (`id`) ON DELETE CASCADE ON UPDATE CASCADE ;
ALTER TABLE `item_details_armor` ADD CONSTRAINT `FK_item_details_armor` FOREIGN KEY (`item_id`) REFERENCES `items` (`id`) ON DELETE CASCADE ON UPDATE CASCADE ;
ALTER TABLE `item_details_armorset` ADD CONSTRAINT `FK_item_details_armorset` FOREIGN KEY (`item_id`) REFERENCES `items` (`id`) ON DELETE CASCADE ON UPDATE CASCADE ;
ALTER TABLE `item_details_bag` ADD CONSTRAINT `FK_item_details_bag` FOREIGN KEY (`item_id`) REFERENCES `items` (`id`) ON DELETE CASCADE ON UPDATE CASCADE ;
ALTER TABLE `item_details_bauble` ADD CONSTRAINT `FK_item_details_bauble` FOREIGN KEY (`item_id`) REFERENCES `items` (`id`) ON DELETE CASCADE ON UPDATE CASCADE ;
ALTER TABLE `item_details_book` ADD CONSTRAINT `FK_item_details_book` FOREIGN KEY (`item_id`) REFERENCES `items` (`id`) ON DELETE CASCADE ON UPDATE CASCADE ;
ALTER TABLE `item_details_food` ADD CONSTRAINT `FK_item_details_food` FOREIGN KEY (`item_id`) REFERENCES `items` (`id`) ON DELETE CASCADE ON UPDATE CASCADE ;
ALTER TABLE `item_details_house` ADD CONSTRAINT `FK_item_details_house` FOREIGN KEY (`item_id`) REFERENCES `items` (`id`) ON DELETE CASCADE ON UPDATE CASCADE ;
ALTER TABLE `item_details_house_container` ADD CONSTRAINT `FK_item_details_house_container` FOREIGN KEY (`item_id`) REFERENCES `items` (`id`) ON DELETE CASCADE ON UPDATE CASCADE ;
ALTER TABLE `item_details_pattern` ADD CONSTRAINT `FK_item_details_pattern` FOREIGN KEY (`item_id`) REFERENCES `items` (`id`) ON DELETE CASCADE ON UPDATE CASCADE ;
ALTER TABLE `item_details_range` ADD CONSTRAINT `FK_item_details_range` FOREIGN KEY (`item_id`) REFERENCES `items` (`id`) ON DELETE CASCADE ON UPDATE CASCADE ;
ALTER TABLE `item_details_recipe` ADD CONSTRAINT `FK_item_details_recipe` FOREIGN KEY (`item_id`) REFERENCES `items` (`id`) ON DELETE CASCADE ON UPDATE CASCADE ;
ALTER TABLE `item_details_recipe_items` ADD CONSTRAINT `FK_item_details_recipe_items` FOREIGN KEY (`item_id`) REFERENCES `items` (`id`) ON DELETE CASCADE ON UPDATE CASCADE ;
ALTER TABLE `item_details_shield` ADD CONSTRAINT `FK_item_details_shield` FOREIGN KEY (`item_id`) REFERENCES `items` (`id`) ON DELETE CASCADE ON UPDATE CASCADE ;
ALTER TABLE `item_details_skill` ADD CONSTRAINT `FK_item_details_skill` FOREIGN KEY (`item_id`) REFERENCES `items` (`id`) ON DELETE CASCADE ON UPDATE CASCADE ;
ALTER TABLE `item_details_skills` ADD CONSTRAINT `FK_item_details_skills` FOREIGN KEY (`item_id`) REFERENCES `items` (`id`) ON DELETE CASCADE ON UPDATE CASCADE ;
ALTER TABLE `item_details_thrown` ADD CONSTRAINT `FK_item_details_thrown` FOREIGN KEY (`item_id`) REFERENCES `items` (`id`) ON DELETE CASCADE ON UPDATE CASCADE ;
ALTER TABLE `item_details_weapon` ADD CONSTRAINT `FK_item_details_weapon` FOREIGN KEY (`item_id`) REFERENCES `items` (`id`) ON DELETE CASCADE ON UPDATE CASCADE ;
ALTER TABLE `item_effects` ADD CONSTRAINT `FK_item_effects` FOREIGN KEY (`item_id`) REFERENCES `items` (`id`) ON DELETE CASCADE ON UPDATE CASCADE ;
ALTER TABLE `item_levels_override` ADD CONSTRAINT `FK_item_levels_override` FOREIGN KEY (`item_id`) REFERENCES `items` (`id`) ON DELETE CASCADE ON UPDATE CASCADE ;
ALTER TABLE `item_stats` ADD CONSTRAINT `FK_item_stats` FOREIGN KEY (`item_id`) REFERENCES `items` (`id`) ON DELETE CASCADE ON UPDATE CASCADE ;
Items are straight-forward, as they do not reference out to any other tables (currently).
Next are Spawns structures. Before we fly through them however, there are a couple of important data entries we need in order for the references to work. As long as your spawn_npc_equipment, spawn_npc_skills, spawn_npc_spells tables are empty, do the following:
Code: Select all
INSERT INTO `items`(`id`,`name`,`item_type`,`icon`,`count`,`tier`,`skill_id_req`,`skill_id_req2`,`skill_min`,`skill_max`,`weight`,`description`,`show_name`,`attuneable`,`artifact`,`lore`,`temporary`,`notrade`,`novalue`,`nozone`,`nodestroy`,`crafted`,`good_only`,`evil_only`,`ornate`,`heirloom`,`usable`,`slots`,`set_name`,`sell_price`,`stack_count`,`collectable`,`adornment_description`,`offers_quest_id`,`part_of_quest_id`,`quest_unknown`,`max_charges`,`recommended_level`,`adventure_default_level`,`tradeskill_default_level`,`adventure_classes`,`tradeskill_classes`,`soe_id`,`lua_script`) VALUES ( 1,'empty','Normal','0','0','1','0','0','0','0','0',NULL,'1','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0',NULL,'0','1','0',NULL,'0','0','0','0','0','1','1','0','0','0',NULL);
INSERT INTO `spells`(`id`,`type`,`cast_type`,`name`,`description`,`icon`,`icon2`,`icontype`,`class_skill`,`mastery_skill`,`min_class_skill_req`,`duration_until_cancel`,`target_type`,`success_message`,`fade_message`,`interruptable`,`lua_script`,`spell_visual`,`effect_message`,`spell_book_type`,`can_effect_raid`,`affect_only_group_members`,`display_spell_tier`,`friendly_spell`,`group_spell`,`is_active`) VALUES ( '3','0','0','NoName','reference for spawn_npc_spells table sets - DO NOT DELETE!','0','0','0','0','0','0','0','0',NULL,NULL,'1',NULL,'0',NULL,'0','0','0','0','0','0','0');
INSERT INTO `spawn_npc_equipment`(`id`,`equipment_list_id`,`item_id`) VALUES ( 1,'0','1');
INSERT INTO `spawn_npc_skills`(`id`,`skill_list_id`,`skill_id`,`starting_value`) VALUES ( '1','0','1','0');
INSERT INTO `spawn_npc_spells`(`id`,`spell_list_id`,`spell_id`,`spell_tier`) VALUES ( '1','0','3','1');
Since the spawn_npcs table defaults to '0' for these 5 settings (3 primary lists and 2 secondary lists), unfortunately we have to set a bogus equip, skill and spell entry in our tables. Insert a single record into Items, and Spells (we can use skills.id 1 for now). If they are all ID 1, the above insert should be fine for you.
Now the Spawn references:
Code: Select all
-- if spawn.id changes
ALTER TABLE `spawn_ground` ADD CONSTRAINT `FK_groundspawn` FOREIGN KEY (`spawn_id`) REFERENCES `spawn` (`id`) ON DELETE CASCADE ON UPDATE CASCADE ;
ALTER TABLE `spawn_loot` ADD CONSTRAINT `FK_loot_spawn` FOREIGN KEY (`spawn_id`) REFERENCES `spawn` (`id`) ON DELETE CASCADE ON UPDATE CASCADE ;
-- if loottable.id changes
ALTER TABLE `spawn_loot` ADD CONSTRAINT `FK_spawnloot_loottable` FOREIGN KEY (`loottable_id`) REFERENCES `loottable` (`id`) ON DELETE CASCADE ON UPDATE CASCADE;
ALTER TABLE `spawn_npc_equipment` ADD CONSTRAINT `FK_spawn_npc_equipment` FOREIGN KEY (`item_id`) REFERENCES `items` (`id`) ON DELETE CASCADE ON UPDATE CASCADE ;
ALTER TABLE `spawn_npc_skills` ADD CONSTRAINT `FK_spawn_skills` FOREIGN KEY (`skill_id`) REFERENCES `skills` (`id`) ON DELETE CASCADE ON UPDATE CASCADE ;
ALTER TABLE `spawn_npc_spells` ADD CONSTRAINT `FK_spawn_npc_spells` FOREIGN KEY (`spell_id`) REFERENCES `spells` (`id`) ON DELETE CASCADE ON UPDATE CASCADE ;
ALTER TABLE `spawn_npcs` ADD CONSTRAINT `FK_npcs_spawn` FOREIGN KEY (`spawn_id`) REFERENCES `spawn` (`id`) ON DELETE CASCADE ON UPDATE CASCADE ;
ALTER TABLE `spawn_npcs` ADD CONSTRAINT `FK_spawn_equipment_list` FOREIGN KEY (`equipment_list_id`) REFERENCES `spawn_npc_equipment` (`equipment_list_id`) ON DELETE CASCADE ON UPDATE CASCADE ;
ALTER TABLE `spawn_npcs` ADD CONSTRAINT `FK_spawn_skill_list` FOREIGN KEY (`skill_list_id`) REFERENCES `spawn_npc_skills` (`skill_list_id`) ON DELETE CASCADE ON UPDATE CASCADE ;
ALTER TABLE `spawn_npcs` ADD CONSTRAINT `FK_spawn_sec_skill` FOREIGN KEY (`secondary_skill_list_id`) REFERENCES `spawn_npc_skills` (`skill_list_id`) ON DELETE CASCADE ON UPDATE CASCADE ;
ALTER TABLE `spawn_npcs` ADD CONSTRAINT `FK_spawn_spell_list` FOREIGN KEY (`spell_list_id`) REFERENCES `spawn_npc_spells` (`spell_list_id`) ON DELETE CASCADE ON UPDATE CASCADE ;
ALTER TABLE `spawn_npcs` ADD CONSTRAINT `FK_spawn_sec_spell` FOREIGN KEY (`secondary_spell_list_id`) REFERENCES `spawn_npc_spells` (`spell_list_id`) ON DELETE CASCADE ON UPDATE CASCADE ;
ALTER TABLE `spawn_objects` ADD CONSTRAINT `FK_objects_spawn` FOREIGN KEY (`spawn_id`) REFERENCES `spawn` (`id`) ON DELETE CASCADE ON UPDATE CASCADE ;
ALTER TABLE `spawn_signs` ADD CONSTRAINT `FK_signs_spawn` FOREIGN KEY (`spawn_id`) REFERENCES `spawn` (`id`) ON DELETE CASCADE ON UPDATE CASCADE ;
ALTER TABLE `spawn_widgets` ADD CONSTRAINT `FK_widgets_spawn` FOREIGN KEY (`spawn_id`) REFERENCES `spawn` (`id`) ON DELETE CASCADE ON UPDATE CASCADE ;
-- Spawn location data
ALTER TABLE `spawn_location_entry` ADD CONSTRAINT `FK_spawn_entry1` FOREIGN KEY (`spawn_location_id`) REFERENCES `spawn_location_name` (`id`) ON DELETE CASCADE ON UPDATE CASCADE ;
ALTER TABLE `spawn_location_entry` ADD CONSTRAINT `FK_spawn_entry2` FOREIGN KEY (`spawn_id`) REFERENCES `spawn` (`id`) ON DELETE CASCADE ON UPDATE CASCADE ;
ALTER TABLE `spawn_location_placement` ADD CONSTRAINT `FK_placement1` FOREIGN KEY (`spawn_location_id`) REFERENCES `spawn_location_name` (`id`) ON DELETE CASCADE ON UPDATE CASCADE ;
ALTER TABLE `spawn_location_placement` ADD CONSTRAINT `FK_placement2` FOREIGN KEY (`zone_id`) REFERENCES `zones` (`id`) ON DELETE CASCADE ON UPDATE CASCADE ;
ALTER TABLE `spawn_location_group` ADD CONSTRAINT `FK_group_placement` FOREIGN KEY (`placement_id`) REFERENCES `spawn_location_placement` (`id`) ON DELETE CASCADE ON UPDATE CASCADE ;
ALTER TABLE `spawn_location_group_associations` ADD CONSTRAINT `FK_group_association1` FOREIGN KEY (`group_id1`) REFERENCES `spawn_location_group` (`group_id`) ON DELETE CASCADE ON UPDATE CASCADE;
ALTER TABLE `spawn_location_group_associations` ADD CONSTRAINT `FK_group_association2` FOREIGN KEY (`group_id2`) REFERENCES `spawn_location_group` (`group_id`) ON DELETE CASCADE ON UPDATE CASCADE;
ALTER TABLE `spawn_location_group_chances` ADD CONSTRAINT `FK_group_chances` FOREIGN KEY (`group_id`) REFERENCES `spawn_location_group` (`group_id`) ON DELETE CASCADE ON UPDATE CASCADE;
Spawn data is quite complex, so everything needs to be perfect for this to work. First, you are tying all spawn_* tables to the parent table `spawn`, except for some that tie back to Items, Spells, and Skills, or within each subset of tables (like the spawn_location_* stuff).
Last major system is Spells, and it is much simpler than the others:
Code: Select all
ALTER TABLE `spell_classes` ADD CONSTRAINT `FK_spell_classes` FOREIGN KEY (`spell_id`) REFERENCES `spells` (`id`) ON DELETE CASCADE ON UPDATE CASCADE ;
ALTER TABLE `spell_data` ADD CONSTRAINT `FK_spell_data` FOREIGN KEY (`spell_id`) REFERENCES `spells` (`id`) ON DELETE CASCADE ON UPDATE CASCADE ;
ALTER TABLE `spell_display_effects` ADD CONSTRAINT `FK_spell_display_effects` FOREIGN KEY (`spell_id`) REFERENCES `spells` (`id`) ON DELETE CASCADE ON UPDATE CASCADE ;
ALTER TABLE `spell_tiers` ADD CONSTRAINT `FK_spell_tiers` FOREIGN KEY (`spell_id`) REFERENCES `spells` (`id`) ON DELETE CASCADE ON UPDATE CASCADE ;
See? Simple.
Now the remaining constraints:
Faction Alliances:
Code: Select all
-- if factions.id changes
ALTER TABLE `faction_alliances` ADD CONSTRAINT `FK_faction_alliances` FOREIGN KEY (`faction_id`) REFERENCES `factions` (`id`) ON DELETE CASCADE ON UPDATE CASCADE ;
GroundSpawns:
Code: Select all
-- if items.id changes
ALTER TABLE `groundspawn_items` ADD CONSTRAINT `FK_groundspawn_items` FOREIGN KEY (`item_id`) REFERENCES `items` (`id`) ON DELETE CASCADE ON UPDATE CASCADE ;
-- if groundspawn_items.groundspawn_entry_id changes
ALTER TABLE `groundspawn_bonus` ADD CONSTRAINT `FK_groundspawn_bonus` FOREIGN KEY (`groundspawn_entry_id`) REFERENCES `groundspawn_items` (`groundspawn_entry_id`) ON DELETE CASCADE ON UPDATE CASCADE ;
Loot Tables:
Code: Select all
-- if items.id changes
ALTER TABLE `lootdrop` ADD CONSTRAINT `FK_lootdrop` FOREIGN KEY (`item_id`) REFERENCES `items` (`id`) ON DELETE CASCADE ON UPDATE CASCADE ;
-- if loottable.id changes
ALTER TABLE `lootdrop` ADD CONSTRAINT `FK_loottable` FOREIGN KEY (`loot_table_id`) REFERENCES `loottable` (`id`) ON DELETE CASCADE ON UPDATE CASCADE ;
Merchant Inventory (this one's a little goofy for some reason):
Code: Select all
ALTER TABLE `merchants` DROP INDEX `MerchantsIDX`;
ALTER TABLE `merchant_inventory` ADD CONSTRAINT `FK_merchant_inventory1` FOREIGN KEY (`inventory_id`) REFERENCES `merchants` (`inventory_id`) ON DELETE CASCADE ON UPDATE CASCADE ;
ALTER TABLE `merchant_inventory` ADD CONSTRAINT `FK_merchant_inventory2` FOREIGN KEY (`item_id`) REFERENCES `items` (`id`) ON DELETE CASCADE ON UPDATE CASCADE ;
ALTER TABLE `merchant_inventory` ADD UNIQUE `InventoryItemIDX` (`inventory_id`, `item_id`);
ALTER TABLE `merchants` ADD UNIQUE `MerchantInvIDX` (`merchant_id`, `inventory_id`);
Quest Details:
Code: Select all
ALTER TABLE `quest_details` ADD CONSTRAINT `FK_quest_details` FOREIGN KEY (`quest_id`) REFERENCES `quests` (`quest_id`) ON DELETE CASCADE ON UPDATE CASCADE;
Revive Points:
Code: Select all
ALTER TABLE `revive_points` ADD CONSTRAINT `FK_respawn_points` FOREIGN KEY (`respawn_zone_id`) REFERENCES `zones` (`id`) ON DELETE CASCADE ON UPDATE CASCADE ;
ALTER TABLE `revive_points` ADD CONSTRAINT `FK_revive_zone` FOREIGN KEY (`zone_id`) REFERENCES `zones` (`id`) ON DELETE CASCADE ON UPDATE CASCADE ;
Starting Tables:
Code: Select all
-- if factions.id changes
ALTER TABLE `starting_factions` ADD CONSTRAINT `FK_starting_factions` FOREIGN KEY (`faction_id`) REFERENCES `factions` (`id`) ON DELETE CASCADE ON UPDATE CASCADE;
-- if items.id changes
ALTER TABLE `starting_items` ADD CONSTRAINT `FK_starting_items` FOREIGN KEY (`item_id`) REFERENCES `items` (`id`) ON DELETE CASCADE ON UPDATE CASCADE;
-- if skills.id changes
ALTER TABLE `starting_skills` ADD CONSTRAINT `FK_starting_skills` FOREIGN KEY (`skill_id`) REFERENCES `skills` (`id`) ON DELETE CASCADE ON UPDATE CASCADE;
-- if spells.id changes
ALTER TABLE `starting_spells` ADD CONSTRAINT `FK_starting_spells` FOREIGN KEY (`spell_id`) REFERENCES `spells` (`id`) ON DELETE CASCADE ON UPDATE CASCADE;
-- if zones.id changes
ALTER TABLE `starting_zones` ADD CONSTRAINT `FK_starting_zones` FOREIGN KEY (`zone_id`) REFERENCES `zones` (`id`) ON DELETE CASCADE ON UPDATE CASCADE;
Transporters:
Code: Select all
ALTER TABLE `transporters` ADD CONSTRAINT `FK_transporters` FOREIGN KEY (`destination_zone_id`) REFERENCES `zones` (`id`) ON DELETE CASCADE ON UPDATE CASCADE ;
ALTER TABLE `transporters` ADD CONSTRAINT `FK_transporters2` FOREIGN KEY (`trigger_location_zone_id`) REFERENCES `zones` (`id`) ON DELETE CASCADE ON UPDATE CASCADE ;
WHEW!! I think that's it. Don't be too intimidated by these queries. In most cases if your data is cleaned up, the queries will run without a hitch. If you find a hitch (Zexis.........) just have a backup on hand for worse-case-scenarios... and post your problems here, I'll be happy to help customites get through this one.