详情页

数据表如何让主键从1开始重新排列而不影响其他内容

时间:2023年12月16日

编辑:佚名

研究了一上午,最后找到了解决办法。
一个主表一个副表,想要一次性将两个表的主键给重新排列。
本来说靠PHP来遍历处理,结果离谱,太慢了,于是直接上SQL代码处理!
SQL代码:
#创建同结构的item_instance_new
CREATE TABLE item_instance_new LIKE item_instance;
#设置自增ID:
ALTER TABLE `item_instance_new` CHANGE `guid` `guid` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT;
#创建一个备份字段
ALTER TABLE `item_instance_new` ADD `guid_bak_id` INT(10) NOT NULL AFTER `guid`;
#将旧表字段移动到新表
INSERT INTO item_instance_new (guid_bak_id, itemEntry, owner_guid, creatorGuid, giftCreatorGuid, count, duration, charges, flags, enchantments, randomPropertyId, reforgeID, transmogrifyId, upgradeID, durability, playedTime, text, pet_species, pet_breed, pet_quality, pet_level, isbot, money, aid)
SELECT guid, itemEntry, owner_guid, creatorGuid, giftCreatorGuid, count, duration, charges, flags, enchantments, randomPropertyId, reforgeID, transmogrifyId, upgradeID, durability, playedTime, text, pet_species, pet_breed, pet_quality, pet_level, isbot, money, aid
FROM item_instance;
#取消自增ID
ALTER TABLE `item_instance_new` CHANGE `guid` `guid` INT(10) UNSIGNED NOT NULL DEFAULT '0';
#创建同结构的 character_inventory_new
CREATE TABLE character_inventory_new LIKE character_inventory;
#设置自增
ALTER TABLE `character_inventory_new` CHANGE `item` `item` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT 'Item Global Unique Identifier';
#创建一个备份字段
ALTER TABLE `character_inventory_new` ADD `item_bak_id` INT(10) NOT NULL AFTER `item`;
#条件判断后进行迁移
INSERT INTO character_inventory_new (bag, slot, guid, item, item_bak_id)
SELECT t1.bag, t1.slot, t1.guid, t3.guid, t1.item
FROM character_inventory t1
JOIN item_instance_new t3 ON t1.item = t3.guid_bak_id
WHERE t1.item = t3.guid_bak_id;
#查找多余的ID数据
SELECT * FROM character_inventory
WHERE item NOT IN (SELECT item_bak_id FROM character_inventory_new);
#多余是数据进行重新排列
INSERT INTO character_inventory_new (bag, slot, guid, item_bak_id)
SELECT bag, slot, guid, item FROM character_inventory WHERE item NOT IN (SELECT item_bak_id FROM character_inventory_new);
#取消自增ID并还原设置
ALTER TABLE `character_inventory_new` CHANGE `item` `item` INT(10) UNSIGNED NOT NULL DEFAULT '0' COMMENT 'Item Global Unique Identifier';
代码详解
这段代码是一个数据库迁移脚本,用于创建新的表并将旧表中的数据迁移到新表中。下面对每个步骤进行解释:
创建同结构的item_instance_new表:通过CREATE TABLE item_instance_new LIKE item_instance;语句创建一个与item_instance表结构相同的新表item_instance_new。
设置自增ID:通过ALTER TABLE item_instance_newCHANGEguid guid INT(10) UNSIGNED NOT NULL AUTO_INCREMENT;语句设置item_instance_new表的guid字段为自增ID,具体意思是在插入数据时,该字段会自动递增生成唯一的ID。
创建一个备份字段:通过ALTER TABLE item_instance_newADDguid_bak_idINT(10) NOT NULL AFTERguid;语句在item_instance_new表中添加一个名为guid_bak_id的字段,用于备份旧表的guid字段。
将旧表字段移动到新表:通过INSERT INTO item_instance_new (guid_bak_id, itemEntry, owner_guid, creatorGuid, giftCreatorGuid, count, duration, charges, flags, enchantments, randomPropertyId, reforgeID, transmogrifyId, upgradeID, durability, playedTime, text, pet_species, pet_breed, pet_quality, pet_level, isbot, money, aid) SELECT guid, itemEntry, owner_guid, creatorGuid, giftCreatorGuid, count, duration, charges, flags, enchantments, randomPropertyId, reforgeID, transmogrifyId, upgradeID, durability, playedTime, text, pet_species, pet_breed, pet_quality, pet_level, isbot, money, aid FROM item_instance;语句将item_instance表中的数据插入到item_instance_new表中,同时使用guid字段的值填充guid_bak_id字段。
取消自增ID:通过ALTER TABLE item_instance_newCHANGEguid guid INT(10) UNSIGNED NOT NULL DEFAULT '0';语句取消item_instance_new表的guid字段的自增属性,并将默认值设置为0。
创建同结构的character_inventory_new表:通过CREATE TABLE character_inventory_new LIKE character_inventory;语句创建一个与character_inventory表结构相同的新表character_inventory_new。
设置自增:通过ALTER TABLE character_inventory_newCHANGEitem item INT(10) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT 'Item Global Unique Identifier';语句设置character_inventory_new表的item字段为自增ID,并添加注释说明。
条件判断后进行迁移:通过INSERT INTO character_inventory_new (bag, slot, guid, item) SELECT t1.bag, t1.slot, t1.guid, t3.guid FROM character_inventory t1 JOIN item_instance_new t3 ON t1.item = t3.guid_bak_id WHERE t1.item = t3.guid_bak_id;语句将character_inventory表中满足条件的数据迁移到character_inventory_new表中。具体条件是t1.item(character_inventory表中的item字段)等于t3.guid_bak_id(item_instance_new表中的guid_bak_id字段)。
取消自增ID并还原设置:通过ALTER TABLE character_inventory_newCHANGEitem item INT(10) UNSIGNED NOT NULL DEFAULT '0' COMMENT 'Item Global Unique Identifier';语句取消character_inventory_new表的item字段的自增属性,并将默认值设置为0,并添加注释说明。
这段代码的作用是将旧表item_instance和character_inventory的数据迁移到新表item_instance_new和character_inventory_new中,并对新表的某些字段进行设置。
相关文章
猜你需要