用于禁用约束的 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 执行的主要内容,如果未能解决你的问题,请参考以下文章