1

アプリケーションで timetravel 関数 (F.39. spi、PostgreSQL 9.1 ドキュメント) を使用したかったのですが、適切に機能していないようです。テーブルに行を挿入すると、すべてが正常に機能し、開始日と終了日が適切に取得されますが、これらの行を更新しようとすると、postgres で PRIMARY KEY 制約の違反に関するエラーが表示されます。彼は、前のタプルと同じプライマリ ID を持つタプルを挿入しようとしています...

データベース内のすべてのテーブルから主キー制約を削除するのは正気ではありませんが、必要な機能です。タイムトラベルの経験があるかもしれません。

あらゆる種類の助けをいただければ幸いです。前もって感謝します。

DDL:

CREATE TABLE cities
(
  city_id serial NOT NULL, 
  state_id integer, 
  name character varying(80) NOT NULL,
  start_date abstime,
  stop_date abstime,
  CONSTRAINT pk_cities PRIMARY KEY (city_id ),
  CONSTRAINT fk_cities_states FOREIGN KEY (state_id)
      REFERENCES states (state_id) MATCH SIMPLE
      ON UPDATE CASCADE ON DELETE NO ACTION
)
WITH (
  OIDS=FALSE
);



-- Trigger: time_travel on cities

-- DROP TRIGGER time_travel ON cities;

CREATE TRIGGER time_travel
  BEFORE INSERT OR UPDATE OR DELETE
  ON cities
  FOR EACH ROW
  EXECUTE PROCEDURE timetravel('start_date', 'stop_date');

与えられた声明:

INSERT INTO cities(
            state_id, name)
    VALUES (20,'Paris');

それは大丈夫です。start_date と stop_date を取得します。しかし、によって:

UPDATE cities SET name='Rome' WHERE name='Paris'

前述のエラーが発生します。

状態のスキーマ

-- Table: states

-- DROP TABLE states;

CREATE TABLE states
(
  state_id serial NOT NULL, -- unikatowy numer wojewodztwa
  country_id integer, -- identyfikator panstwa, w ktorym znajduje sie wojewodztwo
  name character varying(50), -- nazwa wojewodztwa
  CONSTRAINT pk_states PRIMARY KEY (state_id ),
  CONSTRAINT uq_states_state_id UNIQUE (state_id )
)
WITH (
  OIDS=FALSE
);

残念ながら、新しいユーザーとして、ここに画像を投稿することは許可されていません。あなたはそこにそれらを見ることができます:

テーブル都市のサンプル データ: korpusvictifrew.cba.pl/postgres_cities.png

テーブル状態からのサンプル データ: korpusvictifrew.cba.pl/states_data.png

4

1 に答える 1

2

タイムトラベルは、UPDATE を古いレコードの stop_date の UPDATE と、変更されたデータと無限の stop_date を含む新しいレコードの INSERT に変換します。pk_cities のため、city_id に対して複数のレコードを持つことはできません。タイムトラベルのトリガーでは、その要件を破ることはできません。

これは使用できません:

CONSTRAINT pk_cities PRIMARY KEY (city_id )

これを使用する必要があります

CONSTRAINT pk_cities PRIMARY KEY (city_id, stop_date)
于 2012-05-10T22:56:14.440 に答える