ALTER TABLE CREATE CONSTRAINT IF NOT EXIST 可能吗?

Posted

技术标签:

【中文标题】ALTER TABLE CREATE CONSTRAINT IF NOT EXIST 可能吗?【英文标题】:ALTER TABLE CREATE CONSTRAINT IF NOT EXIST possible? 【发布时间】:2017-09-30 22:27:05 【问题描述】:

我有一个应用程序启动 (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 数据库。

【问题讨论】:

你试过IF NOT EXISTS吗?文档似乎表明这是可能的h2database.com/html/grammar.html#constraint_name_definition 【参考方案1】:

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

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;

【讨论】:

很明显,我以为我试过了,但显然我在尝试时搞砸了。谢谢【参考方案2】:

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

【讨论】:

【参考方案3】:

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

【讨论】:

这是完全不可读的。请考虑使用markdown。也可以使用 句号 (.) 来标记句子的结尾。

以上是关于ALTER TABLE CREATE CONSTRAINT IF NOT EXIST 可能吗?的主要内容,如果未能解决你的问题,请参考以下文章

Hive - Create Table&Drop Table & ALTER Table(上)

create index 与 alter table add index 区别

是否可以回滚主要 SQL 数据库中的 CREATE TABLE 和 ALTER TABLE 语句?

ALTER TABLE CREATE CONSTRAINT IF NOT EXIST 可能吗?

mysql alter table修改表命令整理

mysql索引