用于禁用约束的 Informix DDL 执行

Posted

技术标签:

【中文标题】用于禁用约束的 Informix DDL 执行【英文标题】:Informix DDL execution for constraint disabling 【发布时间】:2013-08-07 13:59:42 【问题描述】:

我计划在清除某些数据时禁用外键约束以避免递归关系。主要步骤如下:

Connection conn = getConnection(SI_SINGLE_URL2, SI_UNAME2, SI_PASS2); // will return a valid java,sql.Connection
Statement stmt = conn.createStatement();  
boolean isConstraintDisabled = stmt.execute("ALTER TABLE zee_temp_tab_2 NOCHECK CONSTRAINT ALL");  
stmt.executeQuery("DELETE FROM zee_temp_tab_2 WHERE id = 'A'");
boolean isConstraintEnabled =  stmt.execute("ALTER TABLE zee_temp_tab_2 CHECK CONSTRAINT ALL");

请告知如何做。

【问题讨论】:

【参考方案1】:

禁用表的所有约束(PK、唯一、非空、检查)

 set constraints for table <table> disabled;

或特定的约束

 set constraints <constraint_name> disabled;

要启用,只需使用“启用”参数。 观察:所有 PK、FK 和 UNIQUE 都将重新创建它们的内部索引……取决于您的记录数,可能需要一些时间……小心。

其他选项是使用“延迟”选项(这样您不需要禁用,但需要在单个事务中完成所有操作。)

set constraints <ALL|constraint_name> deferred;
begin work;
-- do what you have to do
commit work; -- the constraints will be validated here...
set constraints <ALL|constraint_name> immediate;

还有“过滤”选项......但这有点复杂,需要您的 DBA 的支持。

更多信息,搜索此命令进入online manual

【讨论】:

我不想使用存储过程,我想使用 JDBC API。 @Zeeshan ,我不知道您在我描述的命令中看到存储过程的位置。它们都是 Informix 语句,您可以在其中使用 stmt.execute 调用,就像您的代码一样。当然,您可能会用 Informix JDBC 调用替换 begin work / commit work 来控制您的事务。

以上是关于用于禁用约束的 Informix DDL 执行的主要内容,如果未能解决你的问题,请参考以下文章

Oracle | DDL&约束&DCL&TCL

MySQL基础-17DDL语言(数据定义语言)-常见约束

如何在 Informix 中创建 CHECK 约束?

msql_DDL_创建table

SQL语法

Informix:IN 子句中的项目数量限制?