Files
nxxmdata/backend/reorder-farms-id.js
2025-08-25 15:00:46 +08:00

105 lines
3.6 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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);