使用嵌套查询或变量从h2数据库中更改表和放置约束

时间:2019-09-02 04:50:27

标签: sql h2

我正在尝试从用于弹簧启动测试的内存h2数据库中删除对表LEARNING和列PERSON_ID的约束。

我尝试使用变量:

SET @cnstrnt=select CONSTRAINT_NAME from information_schema.constraints where table_name='LEARNING' and column_list='PERSON_ID';
alter table learning drop constraint @cnstrnt;

并使用嵌套查询:

alter table learning drop constraint (select CONSTRAINT_NAME from information_schema.constraints where table_name='LEARNING' and column_list='PERSON_ID');

都抱怨expected IDENTIFIER

但是,当我第一次在找到CONSTRAINT_NAME的位置执行select并使用在drop constraint查询中复制此值时,可以删除约束。我想做到这一点而无需人工干预。

您能告诉我为什么我无法通过上述查询删除约束吗?

1 个答案:

答案 0 :(得分:1)

您不能使用字符串作为标识符。实际上,您不能用其他任何内容替换标识符,您需要知道其名称。

您可以从Java代码执行内部查询并生成第二条命令。仅在H2 1.4.199和更早的版本中无法处理SQL,即将推出的1.4.200为此将具有一个EXECUTE IMMEDIATE 'SQL string'命令。

当然,如果确实需要通过某些SQL脚本执行此任务,则可以直接在SQL代码中定义Java函数并调用它,但是这样的解决方案会过于复杂。