-- 通信卡以 sim_card.iccid 为权威数据;机巢不再保存冗余 ICCID。 -- 执行前请备份数据库。本迁移会先将已登记机巢中的旧 ICCID 回填到通信卡表,随后删除 dock.iccid。 -- 不给 dock_id 加唯一约束:通信卡与机巢仅保留可选关联,不限制一对一。 SET @next_sim_card_id := (SELECT COALESCE(MAX(id), 0) FROM sim_card); SET @row_number := 0; INSERT INTO sim_card ( id, user_id, dock_id, carrier, phone, iccid, plan_gb, used_gb, status, carrier_status, created_at, updated_at ) SELECT @next_sim_card_id := @next_sim_card_id + 1, source.user_id, source.dock_id, '', '', source.iccid, 0, 0, 'active', 'normal', NOW(), NOW() FROM ( SELECT d.user_id, MIN(d.dock_id) AS dock_id, d.iccid FROM dock d LEFT JOIN sim_card s ON s.iccid = d.iccid WHERE d.user_id > 0 AND d.iccid IS NOT NULL AND TRIM(d.iccid) <> '' AND s.id IS NULL GROUP BY d.user_id, d.iccid ORDER BY d.user_id, d.iccid ) AS source; ALTER TABLE dock DROP COLUMN iccid;