ALTER TABLE CREATE CONSTRAINT IF NOT EXIST 可能吗?
ALTER TABLE CREATE CONSTRAINT IF NOT EXIST possible?
我有一个应用程序可以启动 (AppStarter) 带有网络应用程序的网络服务器。 Web 应用程序具有迁移脚本 (flyway)。
我想通过 JDBC 在 table 中从 AppStarter 写入一些数据。但是我想创建 table 如果它不存在。 table 也有一些限制。
在 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 应用程序还从该 table 中读取一些信息并创建 table。
现在我有一个 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 数据库。
使用此查询获取外键约束
SELECT * 从 INFORMATION_SCHEMA.CONSTRAINTS 哪里 CONSTRAINT_TYPE = 'REFERENTIAL'
根据我的评论,这应该是可能的:
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;
您可以尝试 ALTER TABLE IF EXISTS,如 CREATE IF EXISTS。如果它仅由您的应用程序负责,而不是由其他应用程序或脚本处理。
我有一个应用程序可以启动 (AppStarter) 带有网络应用程序的网络服务器。 Web 应用程序具有迁移脚本 (flyway)。
我想通过 JDBC 在 table 中从 AppStarter 写入一些数据。但是我想创建 table 如果它不存在。 table 也有一些限制。
在 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 应用程序还从该 table 中读取一些信息并创建 table。 现在我有一个 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 数据库。
使用此查询获取外键约束 SELECT * 从 INFORMATION_SCHEMA.CONSTRAINTS 哪里 CONSTRAINT_TYPE = 'REFERENTIAL'
根据我的评论,这应该是可能的:
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;
您可以尝试 ALTER TABLE IF EXISTS,如 CREATE IF EXISTS。如果它仅由您的应用程序负责,而不是由其他应用程序或脚本处理。