研究了一上午,最后找到了解决办法。
一个主表一个副表,想要一次性将两个表的主键给重新排列。
本来说靠PHP来遍历处理,结果离谱,太慢了,于是直接上SQL代码处理!
SQL代码:
代码详解
这段代码是一个数据库迁移脚本,用于创建新的表并将旧表中的数据迁移到新表中。下面对每个步骤进行解释:
-
创建同结构的item_instance_new表:通过
CREATE TABLE item_instance_new LIKE item_instance;
语句创建一个与item_instance表结构相同的新表item_instance_new。 -
设置自增ID:通过
ALTER TABLE
item_instance_newCHANGE
guidINT(10) UNSIGNED NOT NULL AUTO_INCREMENT;
语句设置item_instance_new表的guid字段为自增ID,具体意思是在插入数据时,该字段会自动递增生成唯一的ID。 -
创建一个备份字段:通过
ALTER TABLE
item_instance_newADD
guid_bak_idINT(10) NOT NULL AFTER
guid;
语句在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_newCHANGE
guidINT(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_newCHANGE
itemINT(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_newCHANGE
itemINT(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中,并对新表的某些字段进行设置。
- 最新
- 最热
只看作者