使用嵌套查询或变量从 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脚本执行这个任务,但是这样解决方案将过于复杂。
我正在尝试从我用于 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脚本执行这个任务,但是这样解决方案将过于复杂。