数据库分表

使用merge引擎来实现分表 

CREATE TABLE table1 (   
`id` int(10) unsigned  NOT NULL AUTO_INCREMENT,   
`name` varchar(45) ,   
PRIMARY KEY (`id`) 
) ENGINE=MyISAM;

CREATE TABLE table2 LIKE table1;

//创建总表
CREATE TABLE tableAll LIKE table1;

ALTER TABLE tableAll ENGINE=MERGE UNION=(table1,table2);

注意:在总表tableAll中会出现主键重复的情况,可以建立只有一个属性的表,自增来生成唯一主键;也可以手动生成一个ID,实现主键唯一的目的,生成主键代码链接
但是这种分表方法有弊端:不支持事务,比较麻烦!
 

使用视图来实现分表 

CREATE TABLE table1 (   
`id` int(10) NOT NULL AUTO_INCREMENT,   
`name` varchar(45) ,   
PRIMARY KEY (`id`) 
);  

CREATE TABLE table2 LIKE table1;

//创建视图 (总表)
create or REPLACE view tableAll as 
select * from table1 
union 
select * from table2;

主键同样存在重复的问题:生成主键代码链接

//分表:user_info_0、user_info_1、user_info_2   视图:user_info

public static void createTable(JdbcTemplate jdbcTemplate, Integer tableNum) {
        try {
            Connection conn = jdbcTemplate.getDataSource().getConnection();
            DatabaseMetaData dbMetaData = conn.getMetaData();
            String tableName = "user_info";
            List<String> list = new ArrayList<>();
            if (tableNum > 0) {
                String tbName = tableName + "_" + tableNum;
                String sql = "CREATE table if not EXISTS " + tbName + " like " + tableName + "_0";
                jdbcTemplate.execute(sql);
            }
            String tableName1 = tableName + "_%";
            ResultSet rs = dbMetaData.getTables(null, null, tableName1, new String[]{"TABLE"});
            while (rs.next()) {
                String string = rs.getString(3);
                list.add(string);
            }
            String sql2 = " create or REPLACE view " + tableName + " as ";
            for (int i = list.size() - 1; i >= 0; i--) {
                String s = list.get(i);
                if (i >= 0 && i < list.size() - 1) {
                    sql2 = sql2 + " union select * from " + s;
                } else if (i == list.size() - 1) {
                    sql2 = sql2 + " select * from " + s;
                }
            }
            jdbcTemplate.execute(sql2);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值