先说结论,mysql最大支持61表连接
使用sql进行测试。
已知表:
CREATE TABLE `uexam` (
`ueno` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '编号',
`eno` bigint(20) DEFAULT NULL COMMENT '考试编号',
`uno` bigint(20) DEFAULT NULL COMMENT '用户编号',
`exe` int(1) unsigned zerofill NOT NULL DEFAULT '0' COMMENT '参与考试{0.未参加,1.已参加,2.已交卷}',
PRIMARY KEY (`ueno`)
) ENGINE=InnoDB AUTO_INCREMENT=84 DEFAULT CHARSET=utf8mb4;
使用Java循环拼接sql测试:
public static void main(String[] args){
String sql = "select ";
int tables = 64; // 条数
String sql_name = "t0.*";
String sql_table = " uexam t0";
for (int i = 1; i < tables; i++) {
sql_name += ",t"+i+".*";
sql_table += " LEFT JOIN uexam t"+i+" ON "+"t"+(i-1)+".ueno=t"+i+".ueno";
}
sql += sql_name;
sql += " from";
sql += sql_table;
// System.out.println(sql);
List<Map<String, Object>> maps = ViewJDBC.queryMapList(sql);
System.out.println(maps);
}
通过tables控制数量,测试最大支持量为61,上面64会报以下错误:
java.sql.SQLException: Too many tables; MySQL can only use 61 tables in a join
多表连接时,不一定要用 = 号,也可以是 != ,或者 > ,< 与其他符号。某个表中数据不存在时则部分行的部分列返回空,可以放心把表设计为范式并使用 join 连接,可以去掉数据冗余。