如果不存在,ALTER TABLE CREATE CONSTRAINT?

时间:2017-05-03 07:45:56

标签: 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;

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
);

但是,只有当它们不存在时,我该如何创建约束?

提前致谢

目前,如果

存在约束,我可以得到
select * from INFORMATION_SCHEMA.CONSTRAINTS WHERE CONSTRAINT_NAME='CURTRP_USER_ID'

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

修改 我可以将约束部分全部移动到迁移脚本中,但这似乎有些不对。

我正在使用H2数据库。

3 个答案:

答案 0 :(得分:2)

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

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;

答案 1 :(得分:0)

使用此查询获取外键约束 SELECT * FROM INFORMATION_SCHEMA.CONSTRAINTS WHERE CONSTRAINT_TYPE ='REFERENTIAL'

答案 2 :(得分:-1)

您可以尝试ALTER TABLE IF EXISTS,例如CREATE IF EXISTS。如果它仅对您的应用程序负责,而不是由其他应用程序或脚本处理。