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
中使用复制此值时,我可以删除约束。drop constraint
我想在没有人工干预的情况下做到这一点。
你能告诉我为什么我没有通过上面的查询放弃约束吗?
解决方案
您不能使用字符串值作为标识符。实际上你不能用其他任何东西替换一个标识符,你需要知道它的名字。
您可以从 Java 代码执行内部查询并生成第二个命令。仅在 H2 1.4.199 和更早的版本中无法使用 SQL,即将推出的 1.4.200 将EXECUTE IMMEDIATE 'SQL string'
为此目的提供命令。
当然,你可以直接在 SQL 代码中定义一个 Java 函数并调用它,如果你确实需要通过一些 SQL 脚本来执行这个任务,但是这样的解决方案会过于复杂。
推荐阅读
- f# - Excel DNA UDF obtain unprocessed values as inputs
- javascript - 使用数据值的 jQuery 选择器不适用于以编程方式分配的值
- c++ - 这个数组值是从哪里来的?
- python - 格式化一组来自 Tkinter 标签的数据以插入到列表框中
- node.js - 如何将TTC文件提取为TTF文件
- sql - 如何在 teradata 中将整数数据类型列中的源 NULL 值填充为 NULL
- docker - 无法为 COPY 创建 docker 映像失败:stat /var/lib/docker/tmp/docker-builderXXXXXX 错误
- laravel - 如何在控制器中动态存储输入名称和值
- ngx-charts - ngx-charts-bar-vertical-2d 最小条形宽度
- kotlin - 与 H2 一起使用时出现 NoSuchMethod 错误