2012-05-10 32 views
1

私のアプリケーションではtimetravel関数(F.39。spi、PostgreSQL 9.1 Documentation)を使いたかったのですが、私にとってはうまく動作していないようです。テーブルに行を挿入するとすべてうまく動作しますが、開始日時は正しく設定されますが、これらの行を更新しようとすると、PRIMARY KEY制約に違反するエラーが発生します。彼は以前のタプルと同じプライマリIDを持つタプルを挿入しようとしています...postgresのTimetravel - PRIMARY KEY制約違反

データベースのすべてのテーブルからプライマリキーの制約を削除するのは面倒ですが、それは必要な機能です。だから、あなたはタイムトラベルでいくつかの経験がありますか?

何か助けていただければ幸いです。前もって感謝します。

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

STATEMENT:

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:

+2

を使用する必要がありますが、私たちにCREATE TABLEとあなたが –

+0

を実行しているUPDATE文を表示します([タイムトラベルの例]を相談してみてくださいヒントについてはhttps://github.com/postgres/postgres/blob/master/contrib/spi/timetravel.exampleを参照してください。 [timetravel docs](http://www.postgresql.org/docs/9.1/static/contrib-spi.html)を参照してください。そして、最後に、[時間旅行を使わずに同じ種類の問題を解決するための議論](0120-338-201) –

+0

状態とサンプルレコードを州内に保有しています。 – tuxuday

答えて

1

時間をkorpusvictifrew.cba.pl/states_data.png travelは、UPDATEを古いレコードのstop_dateの更新と、変更されたデータに無限のstop_dateを加えた新しいINSERTのINSERTに変換します。 pk_citiesのために、city_idのレコードを複数持つことはできません。時間トラベルトリガーでは、その要件を破ることはできません。あなたがこれを使用することはできません

CONSTRAINT pk_cities PRIMARY KEY (city_id) 

あなたはこの

CONSTRAINT pk_cities PRIMARY KEY (city_id, stop_date) 
+0

ありがとう、それは動作します。 – Borys

関連する問題