使用嵌套查询或变量从 h2 数据库中更改 table 和删除约束

Alter table and drop constraint from h2 database using nested query or variable

我正在尝试从我用于 spring 启动测试的内存 h2 数据库中删除对 table 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

但是,当我第一次执行 select 时我可以删除约束,在那里我找到 CONSTRAINT_NAME 并在 drop constraint 查询中使用复制该值。我想在没有人工干预的情况下执行此操作。

你能告诉我为什么我无法使用上面的查询删除约束吗?

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

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

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