lrj
3 天以前 9f8395fab13ca4b230a0f7d62636e209745c91d4
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
package com.rongyichuang.tools;
 
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.jdbc.core.JdbcTemplate;
 
import java.util.List;
import java.util.Map;
 
@SpringBootTest
public class ActivityPlayerRegionUpdater {
 
    @Autowired
    private JdbcTemplate jdbcTemplate;
 
    @Test
    public void addRegionFieldToActivityPlayer() {
        System.out.println("=== 为 t_activity_player 表添加 region_id 字段 ===");
        
        try {
            // 1. 检查字段是否已存在
            String checkColumnSql = """
                SELECT COLUMN_NAME 
                FROM INFORMATION_SCHEMA.COLUMNS 
                WHERE TABLE_SCHEMA = DATABASE() 
                AND TABLE_NAME = 't_activity_player' 
                AND COLUMN_NAME = 'region_id'
                """;
            
            List<Map<String, Object>> existingColumns = jdbcTemplate.queryForList(checkColumnSql);
            
            if (!existingColumns.isEmpty()) {
                System.out.println("✅ region_id 字段已存在,无需添加");
                return;
            }
            
            // 2. 添加 region_id 字段
            String addColumnSql = """
                ALTER TABLE t_activity_player 
                ADD COLUMN region_id bigint DEFAULT NULL COMMENT '区域ID,关联t_region表' 
                AFTER player_id
                """;
            
            jdbcTemplate.execute(addColumnSql);
            System.out.println("✅ 成功添加 region_id 字段");
            
            // 3. 添加外键约束
            try {
                String addForeignKeySql = """
                    ALTER TABLE t_activity_player 
                    ADD CONSTRAINT fk_activity_player_region 
                    FOREIGN KEY (region_id) REFERENCES t_region(id) 
                    ON DELETE SET NULL ON UPDATE CASCADE
                    """;
                
                jdbcTemplate.execute(addForeignKeySql);
                System.out.println("✅ 成功添加外键约束");
            } catch (Exception e) {
                System.out.println("⚠️ 外键约束添加失败(可能已存在): " + e.getMessage());
            }
            
            // 4. 验证表结构
            String describeTableSql = """
                SELECT COLUMN_NAME, DATA_TYPE, IS_NULLABLE, COLUMN_DEFAULT, COLUMN_COMMENT
                FROM INFORMATION_SCHEMA.COLUMNS 
                WHERE TABLE_SCHEMA = DATABASE() 
                AND TABLE_NAME = 't_activity_player' 
                ORDER BY ORDINAL_POSITION
                """;
            
            List<Map<String, Object>> columns = jdbcTemplate.queryForList(describeTableSql);
            System.out.println("\n=== t_activity_player 表结构 ===");
            for (Map<String, Object> column : columns) {
                System.out.println(String.format("%-20s %-15s %-10s %-15s %s", 
                    column.get("COLUMN_NAME"),
                    column.get("DATA_TYPE"),
                    column.get("IS_NULLABLE"),
                    column.get("COLUMN_DEFAULT"),
                    column.get("COLUMN_COMMENT")
                ));
            }
            
        } catch (Exception e) {
            System.err.println("❌ 操作失败: " + e.getMessage());
            e.printStackTrace();
        }
        
        System.out.println("\n✅ region_id 字段添加完成!");
    }
}