动态删除 H2 约束

Drop H2 constraint dynamically

我想删除 H2(MySQL 数据库)table 中的所有 FK,正如所描述的那样 here。我写了以下查询:

execute immediate ('alter table mytable drop constraint ' || 
QUOTE_IDENT((select "UNIQUE_INDEX_NAME" "INFORMATION_SCHEMA"."CONSTRAINTS" 
where "TABLE_NAME"='mytable' and "CONSTRAINT_TYPE"='REFERENTIAL')));

但是,我运行进入以下异常:

org.h2.jdbc.JdbcSQLSyntaxErrorException: Constraint "PRIMARY_KEY_A" not found; SQL statement: execute immediate ('alter table collection drop constraint ' || QUOTE_IDENT((select "UNIQUE_INDEX_NAME" from "INFORMATION_SCHEMA"."CONSTRAINTS" where "TABLE_NAME"='collection' and "CONSTRAINT_TYPE"='REFERENTIAL'))) [90057-200]

你知道这是为什么吗?

您不能在 H2 中的一个命令中删除多个约束。

但是您可以使用以下命令删除一个名称未知的引用约束:

EXECUTE IMMEDIATE
    SELECT 'ALTER TABLE mytable DROP CONSTRAINT '
        || QUOTE_IDENT(CONSTRAINT_NAME)
    FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS
    WHERE TABLE_NAME ILIKE 'mytable'
    AND CONSTRAINT_TYPE = 'FOREIGN KEY'
    FETCH FIRST ROW ONLY;

如果有多个约束,则需要多次执行此命令,直到抛出异常。