const { Farm, Animal, Device, Alert } = require('./models'); const { sequelize } = require('./config/database-simple'); async function reorderFarmsId() { const transaction = await sequelize.transaction(); try { console.log('开始重新排序farms表ID...'); // 1. 获取所有farms数据,按当前ID排序 const farms = await Farm.findAll({ order: [['id', 'ASC']], transaction }); console.log(`找到 ${farms.length} 个养殖场`); // 2. 创建ID映射表 const idMapping = {}; farms.forEach((farm, index) => { const oldId = farm.id; const newId = index + 1; idMapping[oldId] = newId; console.log(`养殖场 "${farm.name}": ${oldId} -> ${newId}`); }); // 3. 临时禁用外键约束 await sequelize.query('SET FOREIGN_KEY_CHECKS = 0', { transaction }); // 4. 创建临时表存储farms数据 await sequelize.query(` CREATE TEMPORARY TABLE farms_temp AS SELECT * FROM farms ORDER BY id ASC `, { transaction }); // 5. 清空farms表 await sequelize.query('DELETE FROM farms', { transaction }); // 6. 重置自增ID await sequelize.query('ALTER TABLE farms AUTO_INCREMENT = 1', { transaction }); // 7. 按新顺序插入数据 for (let i = 0; i < farms.length; i++) { const farm = farms[i]; const newId = i + 1; await sequelize.query(` INSERT INTO farms (id, name, type, location, address, contact, phone, status, created_at, updated_at) SELECT ${newId}, name, type, location, address, contact, phone, status, created_at, updated_at FROM farms_temp WHERE id = ${farm.id} `, { transaction }); } // 8. 更新animals表的farm_id console.log('\n更新animals表的farm_id...'); for (const [oldId, newId] of Object.entries(idMapping)) { const result = await sequelize.query( 'UPDATE animals SET farm_id = ? WHERE farm_id = ?', { replacements: [newId, oldId], transaction } ); console.log(`Animals: farm_id ${oldId} -> ${newId}, 影响 ${result[0].affectedRows || 0} 行`); } // 9. 更新devices表的farm_id console.log('\n更新devices表的farm_id...'); for (const [oldId, newId] of Object.entries(idMapping)) { const result = await sequelize.query( 'UPDATE devices SET farm_id = ? WHERE farm_id = ?', { replacements: [newId, oldId], transaction } ); console.log(`Devices: farm_id ${oldId} -> ${newId}, 影响 ${result[0].affectedRows || 0} 行`); } // 10. 更新alerts表的farm_id console.log('\n更新alerts表的farm_id...'); for (const [oldId, newId] of Object.entries(idMapping)) { const result = await sequelize.query( 'UPDATE alerts SET farm_id = ? WHERE farm_id = ?', { replacements: [newId, oldId], transaction } ); console.log(`Alerts: farm_id ${oldId} -> ${newId}, 影响 ${result[0].affectedRows || 0} 行`); } // 11. 重新启用外键约束 await sequelize.query('SET FOREIGN_KEY_CHECKS = 1', { transaction }); // 12. 验证数据完整性 console.log('\n验证数据完整性...'); const newFarms = await Farm.findAll({ order: [['id', 'ASC']], transaction }); console.log('更新后的farms表:'); newFarms.forEach(farm => { console.log(`ID: ${farm.id}, Name: ${farm.name}`); }); await transaction.commit(); console.log('\n✅ farms表ID重新排序完成!'); } catch (error) { await transaction.rollback(); console.error('❌ 重新排序失败:', error.message); throw error; } } reorderFarmsId().catch(console.error);