Выполнение Informix DDL для отключения ограничений

Я планирую отключить ограничение внешнего ключа, чтобы избежать рекурсивной связи при очистке некоторых данных. Основные шаги описаны ниже:

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

Посоветуйте, пожалуйста, как это сделать.


person Zeeshan Mustansar    schedule 07.08.2013    source источник


Ответы (1)


Чтобы отключить все ограничения для таблицы (PK, уникальные, не null, отметьте)

 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;

И там опция «фильтруется» ... но это немного сложнее и потребует поддержки вашего администратора базы данных.

Для получения дополнительной информации найдите эти команды в интерактивном руководстве

person ceinmart    schedule 07.08.2013
comment
Я не хочу использовать хранимую процедуру, я хочу использовать JDBC API. - person Zeeshan Mustansar; 07.08.2013
comment
@Zeeshan, я не знаю, где вы видите хранимую процедуру в описываемых мною командах. Все они представляют собой операторы Informix, которые вы можете вызывать с помощью stmt.execute точно так же, как ваш код. Конечно, вы, вероятно, замените begin work / commit work вызовами Informix JDBC для управления вашей транзакцией. - person ceinmart; 08.08.2013