我想使用时间旅行功能(F.39。spi,PostgreSQL 9.1文档),但它似乎不适合我。在表中插入行,一切都很好,我可以正确地获得开始和停止日期,但是当我试图更新这些行时,postgres给了我违反主键约束的错误。他试图插入一个与前一个元组具有相同主id的元组。。。
从数据库中的所有表中删除主键约束是不明智的,但这是我需要的功能。也许你有时间旅行的经验?
任何帮助都将不胜感激。提前谢谢。
动态链接地址:

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

没关系。我得到开始日期和停止日期。
但是通过:
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
来自states表的示例数据:korpusvictifrew.cba.pl/states_data.png

最佳答案

时间旅行将更新转换为旧记录的停止日期的更新,并使用更改的数据和无限的停止日期插入新记录。由于pk城市,您不能有多个城市id记录。时间旅行触发器不允许您违反该要求。
您不能使用:

CONSTRAINT pk_cities PRIMARY KEY (city_id )

你必须用这个
CONSTRAINT pk_cities PRIMARY KEY (city_id, stop_date)

07-24 12:59