sharding-JDBC

使用sharding-JDBC遇到的问题

2020-07-16  本文已影响0人  zhy0324

1.UNION 语句

在项目中有两张表tb_log_through、tb_log_operate,都是根据car_park_id分片,有个需求需要语句union all 这两张表的数据,mybatis中的写法

SELECT
    a.id,
    a.through_time
FROM
    tb_log_through AS a
WHERE
    a.car_park_id = #{carParkId,jdbcType=VARCHAR}
UNION ALL
SELECT
    a.id,
    a.through_time
FROM
    tb_log_operate AS a
WHERE
    a.car_park_id = #{carParkId,jdbcType=VARCHAR}

此时car_park_id 参数为 huael_001的时候,预期的Actual SQL为

SELECT
    a.id,
    a.through_time
FROM
    tb_log_through_huael_001 AS a
WHERE
    a.car_park_id = 'huael_001'
UNION ALL
SELECT
    a.id,
    a.through_time
FROM
    tb_log_operate_huael_001 AS a
WHERE
    a.car_park_id = 'huael_001'

上面sql,可以分别到实际表中拉取数据,在数据库直接执行也没问题
可实际上打印的Actual SQL为

SELECT
    a.id,
    a.through_time
FROM
    tb_log_through_huael_001 AS a
WHERE
    a.car_park_id = 'huael_001'
UNION ALL
SELECT
    a.id,
    a.through_time
FROM
    tb_log_operate AS a
WHERE
    a.car_park_id = 'huael_001'

可以看到 第二张表tb_log_operate,并没有走分表条件,用的还是逻辑表名执行的sql,从而导致数据库找不到此张表,然后报table not exist错。

由此可见:两张配置了分表规则的表,不能在一条语句中用union语句,如果需要合并结果集,则需要执行两次sql,在代码里执行合并
上一篇 下一篇

猜你喜欢

热点阅读