JDBI ALTER TABLE DROP PARTITION

时间:2015-08-19 00:22:15

标签: mysql jdbc jdbi

嘿,我遇到了使用JDBI更改表分区的问题。以下是我正在尝试运行的查询示例:

ALTER TABLE table1 DROP PARTITION P_1

当从表“table1”中删除分区“P_1”时,这在MySQL中运行良好。

我已经在我的java代码中实现了它,如下所示:

@SqlUpdate("ALTER TABLE table1 DROP PARTITION :partition;")
public void deletePartition(@Bind("partition") String partition);

并将此功能称为

deletePartition("P_1")

但是,这会导致以下错误:

  

导致:org.skife.jdbi.v2.exceptions.UnableToExecuteStatementException:com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException:您的SQL语法中有错误;检查与MySQL服务器版本对应的手册,以便在第1行“'P_1''附近使用正确的语法[语句:”ALTER TABLE table1 DROP PARTITION:partition;“,位于:”ALTER TABLE table1 DROP PARTITION:partition; “,重写:”/ * HiveDropBoxDBI.deletePartition * / ALTER TABLE table1 DROP PARTITION?;“,arguments:{positional:{},named:{partition:'P_1'},finder:[]}]

此功能不受支持吗?或者我错过了我的语法?

由于

2 个答案:

答案 0 :(得分:1)

我们需要使用@Define来更改查询。 @Bind仅用于绑定参数(如some_field =:value)。

  @SqlUpdate("ALTER TABLE table1 DROP PARTITION :partition;")
  public void deletePartition(@Bind("partition") String partition);

答案 1 :(得分:1)

您无法对DDL使用绑定参数,例如CREATEALTERDROP

要删除分区,必须将分区名称连接到查询上。

但是,获取分区名称并将其直接附加到执行的SQL字符串中是一个安全漏洞的处方。考虑以下一些事项:

  • '逸出'带反引号的分区名称,
  • 检查分区名称是否仅包含某些列入白名单的字符(例如字母数字和下划线),
  • 查询INFORMATION_SCHEMA.PARTITIONS表,查看您尝试删除的分区是否存在。 (如果在检查分区存在和丢弃分区之间是否有可能创建或删除分区,这可能不是一个好主意。我不太清楚你的应用程序是否足以说明这是否是一个问题。 )

由于JDBI依赖于@SqlUpdate注释的常量字符串,因此您将无法以这种方式使用JDBI来删除分区,除非您只想删除相同的分区。