2012-05-10 13 views
1

내 응용 프로그램에 timetravel 함수 (F.39. spi, PostgreSQL 9.1 설명서)를 사용하고 싶지만 제대로 작동하지 않습니다. 테이블에 행을 삽입하면 모든 것이 정상적으로 작동하고 시작과 종료가 올바르게 수행됩니다.하지만 그 행을 업데이트하려고 할 때 postgres가 PRIMARY KEY 제약 조건 위반에 대한 오류를 표시합니다. 그는 이전 튜플과 동일한 기본 ID를 가진 튜플을 삽입하려고합니다 ...Postgres의 Timetravel - PRIMARY KEY 제약 조건을 위반했습니다.

데이터베이스의 모든 테이블에서 기본 키 제약 조건을 제거하는 것은 좋지 않지만 필요한 기능입니다. 그래서 당신은 timetravel에 대한 약간의 경험이 있습니까?

어떤 종류의 도움을 주시면 감사하겠습니다. 미리 감사드립니다.

DDL : GIVEN

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 :

+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-337-209) –

+0

상태 및 샘플 레코드를 제공합니다. – tuxuday

답변

1

시간을 korpusvictifrew.cba.pl/states_data.png travel은 UPDATE를 이전 레코드의 stop_date의 UPDATE와 변경된 데이터 + 무한 정지 _ 날짜를 가진 새 INSERT로 변환합니다. pk_cities 때문에 city_id에 대해 둘 이상의 레코드를 가질 수 없습니다. 시간 이동 트리거를 사용하면 해당 요구 사항을 위반할 수 없습니다.

이 사용할 수 없습니다 :

CONSTRAINT pk_cities PRIMARY KEY (city_id) 

당신이

CONSTRAINT pk_cities PRIMARY KEY (city_id, stop_date) 
+0

감사합니다. 작동합니다. – Borys