2012-05-10 100 views
1

我想在我的应用程序中使用timetravel函数(F.39。spi,PostgreSQL 9.1文档),但它似乎对我无法正常工作。随着插入行到表中的一切工作正常,我得到启动和停止日期正确,但是当我试图更新这些行postgres给我错误的违反PRIMARY KEY约束。他试图插入一个具有与以前的元组相同的主ID的元组...postgres中的timetravel - 违反PRIMARY KEY约束

从数据库的所有表中删除主键约束是疯狂的,但它是我需要的功能。所以也许你有一些timetravel的expierness?

任何形式的帮助将不胜感激。提前致谢。

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

+2

向我们展示的CREATE TABLE和你正在运行 –

+0

的UPDATE语句您可以尝试咨询[时间旅行示例]( https://github.com/postgres/postgres/blob/master/contrib/spi/timetravel.example)提示。 [timetravel文档](http://www.postgresql.org/docs/9.1/static/contrib-spi.html)为那些谁没有见过他们。最后,[讨论解决同类问题而不使用时间旅行](http://stackoverflow.com/questions/125877/versioning-database-persisted-objects-how-would-you) –

+0

发布模式州和样品记录的状态。 – tuxuday

回答

1

时间旅行将UPDATE转换为旧记录的stop_date的UPDATE,并将新数据的INSERT与已更改的数据一起加上无穷大的stop_date。由于pk_cities,您不能有多个city_id的记录。时间旅行触发器不允许您违反该要求。

您不能使用此:

CONSTRAINT pk_cities PRIMARY KEY (city_id) 

您必须使用此

CONSTRAINT pk_cities PRIMARY KEY (city_id, stop_date) 
+0

谢谢,它的工作原理。 – Borys

相关问题