アプリケーションで 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