ALTER TABLE CREATE CONSTRAINT IF NOT EXIST 可能吗?

kis*_*m3t 5 java sql migration h2 flyway

我有一个应用程序,它启动 (AppStarter) 一个带有 Web 应用程序的 Web 服务器。Web 应用程序具有迁移脚本(flyway)。

我想通过 JDBC 将 AppStarter 中的一些数据写入表中。但如果表不存在,我想创建它。该表也有一些限制。

在 AppStarter 中,我执行以下命令:

CREATE CACHED TABLE PUBLIC.CORE_USERROLE_TO_PARAMETER (
    ID VARCHAR(32) PRIMARY KEY NOT NULL,
    VERSION INTEGER,
    USER_ID VARCHAR(32)NOT NULL,
    ROLE_ID VARCHAR(32) NOT NULL,
    PARAMETER VARCHAR(255) NOT NULL
);

ALTER TABLE PUBLIC.CORE_USERROLE_TO_PARAMETER ADD CONSTRAINT PUBLIC.CURTBP_USER_ID FOREIGN KEY(USER_ID) REFERENCES PUBLIC.CORE_USER(ID) NOCHECK;
ALTER TABLE PUBLIC.CORE_USERROLE_TO_PARAMETER ADD CONSTRAINT PUBLIC.CURTBP_ROLE_ID FOREIGN KEY(ROLE_ID) REFERENCES PUBLIC.CORE_USER_ROLE(ID) NOCHECK;
Run Code Online (Sandbox Code Playgroud)

Web 应用程序还会从此表中读取一些信息并创建这些表。现在我有一个 sql 迁移脚本

CREATE CACHED TABLE IF NOT EXISTS PUBLIC.CORE_USERROLE_TO_PARAMETER (
    ID VARCHAR(32) PRIMARY KEY NOT NULL,
    VERSION INTEGER,
    USER_ID VARCHAR(32)NOT NULL,
    ROLE_ID VARCHAR(32) NOT NULL,
    PARAMETER VARCHAR(255) NOT NULL
);
Run Code Online (Sandbox Code Playgroud)

但是,仅当约束尚不存在时,我该如何创建约束?

提前致谢

目前我可以得到是否存在约束

select * from INFORMATION_SCHEMA.CONSTRAINTS WHERE CONSTRAINT_NAME='CURTRP_USER_ID'
Run Code Online (Sandbox Code Playgroud)

但是我如何将其构建为带有 H2 的 if 查询

编辑: 我可以将约束部分全部移到迁移脚本中,但这似乎有些错误。

我正在使用 H2 数据库。

Son*_*ata 4

根据我的评论,这应该是可能的:

ALTER TABLE PUBLIC.CORE_USERROLE_TO_PARAMETER
  ADD CONSTRAINT IF NOT EXISTS PUBLIC.CURTBP_USER_ID
    FOREIGN KEY(USER_ID) REFERENCES PUBLIC.CORE_USER(ID) NOCHECK;

ALTER TABLE PUBLIC.CORE_USERROLE_TO_PARAMETER
  ADD CONSTRAINT IF NOT EXISTS PUBLIC.CURTBP_ROLE_ID
    FOREIGN KEY(ROLE_ID) REFERENCES PUBLIC.CORE_USER_ROLE(ID) NOCHECK;
Run Code Online (Sandbox Code Playgroud)