嘿,我遇到了使用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:[]}]
此功能不受支持吗?或者我错过了我的语法?
由于
答案 0 :(得分:1)
我们需要使用@Define来更改查询。 @Bind仅用于绑定参数(如some_field =:value)。
@SqlUpdate("ALTER TABLE table1 DROP PARTITION :partition;")
public void deletePartition(@Bind("partition") String partition);
答案 1 :(得分:1)
您无法对DDL使用绑定参数,例如CREATE
,ALTER
和DROP
。
要删除分区,必须将分区名称连接到查询上。
但是,获取分区名称并将其直接附加到执行的SQL字符串中是一个安全漏洞的处方。考虑以下一些事项:
INFORMATION_SCHEMA.PARTITIONS
表,查看您尝试删除的分区是否存在。 (如果在检查分区存在和丢弃分区之间是否有可能创建或删除分区,这可能不是一个好主意。我不太清楚你的应用程序是否足以说明这是否是一个问题。 )由于JDBI依赖于@SqlUpdate
注释的常量字符串,因此您将无法以这种方式使用JDBI来删除分区,除非您只想删除相同的分区。