const mysql = require('mysql2/promise'); // 資料庫連接配置 const dbConfig = { host: 'mysql.theaken.com', port: 33306, user: 'AI_Platform', password: 'Aa123456', database: 'db_AI_Platform', charset: 'utf8mb4' }; async function fixFavoritesDuplicates() { let connection; try { console.log('連接到資料庫...'); connection = await mysql.createConnection(dbConfig); console.log('檢查重複的收藏記錄...'); // 查找重複記錄 const [duplicates] = await connection.execute(` SELECT user_id, app_id, COUNT(*) as count FROM user_favorites GROUP BY user_id, app_id HAVING COUNT(*) > 1 `); if (duplicates.length === 0) { console.log('沒有發現重複的收藏記錄'); return; } console.log(`發現 ${duplicates.length} 組重複記錄:`); for (const duplicate of duplicates) { console.log(`用戶 ${duplicate.user_id} 對應用 ${duplicate.app_id} 有 ${duplicate.count} 條記錄`); // 保留最早的記錄,刪除其他重複記錄 const [records] = await connection.execute(` SELECT id, created_at FROM user_favorites WHERE user_id = ? AND app_id = ? ORDER BY created_at ASC `, [duplicate.user_id, duplicate.app_id]); if (records.length > 1) { // 保留第一條記錄,刪除其他記錄 const keepRecord = records[0]; const deleteIds = records.slice(1).map(r => r.id); console.log(`保留記錄 ID: ${keepRecord.id} (創建時間: ${keepRecord.created_at})`); console.log(`刪除記錄 IDs: ${deleteIds.join(', ')}`); await connection.execute(` DELETE FROM user_favorites WHERE id IN (${deleteIds.map(() => '?').join(',')}) `, deleteIds); console.log(`已清理 ${deleteIds.length} 條重複記錄`); } } console.log('重複記錄清理完成!'); // 驗證修復結果 const [remainingDuplicates] = await connection.execute(` SELECT user_id, app_id, COUNT(*) as count FROM user_favorites GROUP BY user_id, app_id HAVING COUNT(*) > 1 `); if (remainingDuplicates.length === 0) { console.log('✅ 所有重複記錄已成功清理'); } else { console.log('❌ 仍有重複記錄存在:', remainingDuplicates); } } catch (error) { console.error('修復過程中發生錯誤:', error); } finally { if (connection) { await connection.end(); console.log('資料庫連接已關閉'); } } } // 執行修復 fixFavoritesDuplicates().catch(console.error);