我正在尝试从用于弹簧启动测试的内存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
查询中复制此值时,可以删除约束。我想做到这一点而无需人工干预。
您能告诉我为什么我无法通过上述查询删除约束吗?
答案 0 :(得分:1)
您不能使用字符串值作为标识符。实际上,您不能用其他任何内容替换标识符,您需要知道其名称。
您可以从Java代码执行内部查询并生成第二条命令。仅在H2 1.4.199和更早的版本中无法处理SQL,即将推出的1.4.200为此将具有一个EXECUTE IMMEDIATE 'SQL string'
命令。
当然,如果确实需要通过某些SQL脚本执行此任务,则可以直接在SQL代码中定义Java函数并调用它,但是这样的解决方案会过于复杂。