微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何使用 REFERENCED_TABLE_NAME 在 H2 编辑

如何解决如何使用 REFERENCED_TABLE_NAME 在 H2 编辑

我曾经遇到过这样一种情况,删除外键约束的唯一方法this solution;

-- YOU MUST SPECIFY THESE VARIABLES TO FULLY IDENTIFY A CONSTRAINT
SET @table_name = '...';
SET @column_name = '...';
SET @referenced_table_name = '...';
SET @referenced_column_name = '...';
-- make sure to limit queries to a single db schema
SET @db_name = '...'; 

-- find the name of the foreign key and store it in a var
SET @constraint_name = (
    SELECT constraint_name
    FROM informatION_SCHEMA.KEY_COLUMN_USAGE
    WHERE TABLE_NAME = @table_name
        AND COLUMN_NAME = @column_name
        AND CONSTRAINT_SCHEMA = @db_name
        AND referenced_table_name = @referenced_table_name
        AND referenced_column_name = @referenced_column_name);

-- prepare the drop statement in a string and run it
SET @s = concat('alter table ',@table_name,' drop foreign key ',@constraint_name);

PREPARE stmt FROM @s;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;

我通过 Liquibase 运行这些语句。以上适用于 MysqL,但不适用于 H2。错误是,

SEVERE 2/23/21,12:18 PM: liquibase: adaccount.sql: adaccount.sql::53::acheong: Change Set adaccount.sql::53::acheong Failed.
Error: Column "REFERENCED_TABLE_NAME" not found; sql statement:
SET @constraint_name = (
    SELECT constraint_name
    FROM informatION_SCHEMA.KEY_COLUMN_USAGE
    WHERE TABLE_NAME = @table_name
        AND COLUMN_NAME = @column_name
        AND CONSTRAINT_SCHEMA = @db_name
        AND REFERENCED_TABLE_NAME = @referenced_table_name
        AND REFERENCED_COLUMN_NAME = @referenced_column_name) [42122-196] [Failed sql: SET @constraint_name = (
    SELECT constraint_name
    FROM informatION_SCHEMA.KEY_COLUMN_USAGE
    WHERE TABLE_NAME = @table_name
        AND COLUMN_NAME = @column_name
        AND CONSTRAINT_SCHEMA = @db_name
        AND REFERENCED_TABLE_NAME = @referenced_table_name
        AND REFERENCED_COLUMN_NAME = @referenced_column_name)]
INFO 2/23/21,12:18 PM: liquibase: adaccount.sql::53::acheong: Successfully released change log lock

不确定我是否正在查看正确的参考,但似乎 referenced_table_name 可能不是 a thing in H2

有什么方法可以调整这个准备好的语句,使其同时适用于 MysqL 和 H2?

注意:外键未命名,所以我不能使用简单的 ALTER TABLE ... DROP FOREIGN KEY。我也不能使用 dropForeignKeyContraint,因为我坚持使用非 XML、仅限 sql 的配置。我也研究了其他几种方法——不幸的是,the aforementioned solution 中的用户是对的——没有另一种有效的方法


编辑

感谢@EvgenijRyazanov,我走得更远了。我升级到 H2 1.4.200 以便 EXECUTE IMMEDIATE 可用,并加入 informatION_SCHEMA.referential_CONSTRAINTS。内部查询MysqL 中按预期工作:

enter image description here

然而,H2 中相同的内部查询似乎返回 0 个结果(空字符串):

Syntax error in sql statement "ALTER TABLE audit_event DROP FOREIGN KEY [*]"; expected "identifier"; sql statement:
ALTER TABLE audit_event DROP FOREIGN KEY  [42001-200] [Failed sql: EXECUTE IMMEDIATE @s]

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。