首页 > 解决方案 > 使用嵌套查询或变量从 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中使用复制此值时,我可以删除约束。drop constraint我想在没有人工干预的情况下做到这一点。

你能告诉我为什么我没有通过上面的查询放弃约束吗?

标签: sqlh2

解决方案


您不能使用字符串作为标识符。实际上你不能用其他任何东西替换一个标识符,你需要知道它的名字。

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

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


推荐阅读