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