Как я отключаю ссылочную целостность в Пост-ГРЭС 8.2?

С JDK1.6 вы можете использовать встроенный механизм Javascript.

import javax.script.ScriptEngineManager;
import javax.script.ScriptEngine;
import javax.script.ScriptException;

public class Test {
  public static void main(String[] args) throws ScriptException {
    ScriptEngineManager mgr = new ScriptEngineManager();
    ScriptEngine engine = mgr.getEngineByName("JavaScript");
    String foo = "40+2";
    System.out.println(engine.eval(foo));
    } 
}
35
задан gizmo 1 October 2008 в 16:27
поделиться

4 ответа

Это не кажется возможным. Другие предложения почти всегда относятся к отбрасыванию ограничений и воссозданию их после того, как работа будет сделана.

Однако кажется, что можно сделать ограничения DEFERRABLE, такими, что они не проверяются до конца транзакции. См. документация PostgreSQL для CREATE TABLE (поиск 'допускающего задержку', это посреди страницы).

17
ответ дан Joel B Fant 8 July 2019 в 00:48
поделиться

Я думаю, что Вы должны составить список своих ограничений внешнего ключа, отбросить их, сделать Ваши изменения, затем добавляете ограничения снова. Проверьте документацию на alter table drop constraint и alter table add constraint.

5
ответ дан Liam 8 July 2019 в 00:48
поделиться

Существует две вещи, которые можно сделать (они дополнительны, не альтернативы):

  • Создают Ваши ограничения внешнего ключа как ДОПУСКАЮЩИЕ ЗАДЕРЖКУ. Затем назовите "ОГРАНИЧЕНИЯ НАБОРА ЗАДЕРЖАННЫМИ"; который заставит ограничения внешнего ключа не быть проверенными до конца транзакции. Обратите внимание, что значение по умолчанию, если Вы ничего не определяете, НЕ является ДОПУСКАЮЩИМ ЗАДЕРЖКУ (раздражающе).
  • Вызов "mytable ALTER TABLE ОТКЛЮЧАЕТ, ИНИЦИИРОВАЛИ ВСЕ"; который предотвращает любое триггерное выполнение, в то время как Вы загружаете данные, тогда "mytable ALTER TABLE ВКЛЮЧАЕТ ТРИГГЕРУ ВСЕ"; когда Вы сделаны, чтобы повторно включить им.
48
ответ дан Erwin Brandstetter 8 July 2019 в 00:48
поделиться

Вот сценарий Python, который удаляет все ограничения в транзакции, выполняет некоторые запросы, а затем воссоздает все эти ограничения. pg_get_constraintdef упрощает эту задачу:

class no_constraints(object):
    def __init__(self, connection):
        self.connection = connection

    def __enter__(self):
        self.transaction = self.connection.begin()
        try:
            self._drop_constraints()
        except:
            self.transaction.rollback()
            raise

    def __exit__(self, exc_type, exc_value, traceback):
        if exc_type is not None:
            self.transaction.rollback()
        else:
            try:
                self._create_constraints()
                self.transaction.commit()
            except:
                self.transaction.rollback()
                raise

    def _drop_constraints(self):
        self._constraints = self._all_constraints()

        for schemaname, tablename, name, def_ in self._constraints:
            self.connection.execute('ALTER TABLE "%s.%s" DROP CONSTRAINT %s' % (schemaname, tablename, name))

    def _create_constraints(self):
        for schemaname, tablename, name, def_ in self._constraints:
            self.connection.execute('ALTER TABLE "%s.%s" ADD CONSTRAINT %s %s' % (schamename, tablename, name, def_))

    def _all_constraints(self):
        return self.connection.execute("""
            SELECT n.nspname AS schemaname, c.relname, conname, pg_get_constraintdef(r.oid, false) as condef
                     FROM  pg_constraint r, pg_class c
                     LEFT JOIN pg_namespace n ON n.oid = c.relnamespace
                     WHERE r.contype = 'f'
                    and r.conrelid=c.oid
            """).fetchall()

if __name__ == '__main__':
    # example usage

    from sqlalchemy import create_engine

    engine = create_engine('postgresql://user:pass@host/dbname', echo=True)

    conn = engine.connect()
    with no_contraints(conn):
        r = conn.execute("delete from table1")
        print "%d rows affected" % r.rowcount
        r = conn.execute("delete from table2")
        print "%d rows affected" % r.rowcount
5
ответ дан 27 November 2019 в 06:33
поделиться
Другие вопросы по тегам:

Похожие вопросы: