ОБНОВЛЕНИЕ столбцов, на которые имеются ссылки, и ссылок на столбцы в отношении внешнего ключа - PullRequest
1 голос
/ 08 июня 2011

У меня есть следующий тестовый пример:

DROP SCHEMA IF EXISTS test CASCADE;
CREATE SCHEMA test;

CREATE TABLE test.quz (
  foo int,
  bar int,
  PRIMARY KEY ( foo, bar )
);
CREATE TABLE test.quuz (
  foo int,
  bar int,
  baz int,
  PRIMARY KEY ( foo, bar ),
  FOREIGN KEY ( foo, bar ) REFERENCES test.quz MATCH FULL
);

INSERT INTO test.quz VALUES ( 1, 2 );
INSERT INTO test.quuz VALUES ( 1, 2, 3 );

Однако, даже если deferred, похоже, это не работает.

BEGIN;
  SET CONSTRAINTS ALL DEFERRED;
  UPDATE test.quz SET bar = 100 where bar = 2;
  UPDATE test.quuz SET bar = 100 where bar = 2;
  COMMIT;
END;

Есть ли причина? Можно ли выполнить эту задачу без необходимости вручную удалять и повторно вставлять строки?

1 Ответ

1 голос
/ 08 июня 2011

DEFERRABLE означает, что ограничения проверяются в конце каждого оператора.DEFERRABLE INITIALLY DEFERRED, означает, что ограничения проверяются в конце транзакции.

Это должно работать в вашем случае:

CREATE TABLE test.quuz (
  foo int,
  bar int,
  baz int,
  PRIMARY KEY ( foo, bar ),
  FOREIGN KEY ( foo, bar ) REFERENCES test.quz MATCH FULL DEFERRABLE INITIALLY DEFERRED
);

...

BEGIN;
  UPDATE test.quz SET bar = 100 where bar = 2;
  UPDATE test.quuz SET bar = 100 where bar = 2;
COMMIT;

Это, вероятно, тоже будет работать:

CREATE TABLE test.quuz (
  foo int,
  bar int,
  baz int,
  PRIMARY KEY ( foo, bar ),
  FOREIGN KEY ( foo, bar ) REFERENCES test.quz MATCH FULL DEFERRABLE
);

...

BEGIN;
  SET CONSTRAINTS ALL DEFERRED;
  UPDATE test.quz SET bar = 100 where bar = 2;
  UPDATE test.quuz SET bar = 100 where bar = 2;
COMMIT;

Если я не ошибаюсь, проблема в ваших определениях заключается в том, что вы не помечаете свои ограничения как отложенные.Таким образом, Postgres рассматривает их как NOT DEFERRABLE INITIALLY IMMEDIATE (т. Е. По умолчанию в Postgres, несмотря на стандарт SQL, разумно, что он самый быстрый) независимо от SET CONSTRAINTS (который влияет только на отложенные ограничения).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...