105 lines
3.6 KiB
JavaScript
105 lines
3.6 KiB
JavaScript
|
|
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);
|