2010-02-17 3 views
1

나는 내 postgres 데이터베이스에 테이블을 가지고 있으며, 그 중 일부는 서로 상속합니다. 예를 들어Postgres의 시리얼 값이 2 씩 증가합니다.

:

CREATE TABLE parent_table(parent_table_id SERIAL PRIMARY KEY, 
     my_col1 VARCHAR(16) NOT NULL, 
     my_timestamp TIMESTAMP WITH TIME ZONE NOT NULL); 
CREATE TABLE child_table() INHERITS (parent_table); 
CREATE TABLE step_child_table() INHERITS (parent_table); 

나는 나를 parent_table에 삽입을 수행 할 수 있습니다, 다음 데이터가 정말 어린이나 step_child 테이블로 이동해야하는지 여부를 파악하는 트리거가 있습니다. 예를 들어

:

CREATE OR REPLACE FUNCTION my_parent_trigger() RETURNS TRIGGER AS $$ 
BEGIN 
    IF (NEW.my_col1 > 100) THEN 
     INSERT INTO child_table(my_col1, my_timestamp) VALUES (NEW.my_col1, NEW.my_timestamp); 
    ELSE 
     INSERT INTO step_child_table(my_col1, my_timestamp) VALUES (NEW.my_col1, NEW.my_timestamp); 
    END IF; 
    RETURN NULL; 
END; 
$$ 
CREATE TRIGGER my_trigger BEFORE INSERT ON parent_table FOR EACH ROW EXECUTE PROCEDURE my_parent_trigger(); 

문제는 내가 일부 데이터를 삽입하면 내 인덱스가 2 씩 증가되어 있다는 것입니다, 나는, 내 인덱스가 2로 시작하는 것을 볼 수 parent_table에 선택을하고 이동 to 4, 6, 8, 10, ... child_table에서 select를 수행하면 내 색인 (예 : 2, 8 및 10)이 표시되고 나머지는 다른 테이블에 표시됩니다.

왜 이런가요? 내가 그걸 막을 수있는 방법이 있니? 트리거는 삽입하기 전에 설정되므로 직렬이 두 번 증가하는 이유는 알 수 없습니다.

중요합니까?

미리 감사드립니다.

답변

1

자식 테이블에 삽입 할 때 parent_table_id 열을 포함시켜야한다고 생각합니다.

지금은 상위 삽입에 대해 시퀀스가 ​​한 단계 앞으로 이동하고 그 값이 NEW의 함수에 전달됩니다. 그런 다음이를 버리고 하위 테이블에 삽입 할 때 새 시스템을 생성하도록 시스템에 요청하십시오.

그래서 열 목록에 parent_table_id를 포함시키고 NEW.parent_table_id 값을 삽입하십시오.

+0

내 문제를 해결하는 것으로 보입니다. 내 삽입물은 이제 "INSERT INTO child_table (parent_table_id, my_col1, my_timestamp) VALUES (NEW.my_parent_id, NEW.my_col1, NEW.my_timestamp)와 같이 보입니다. 문제가 해결되었지만 이는 합법적 인 조치입니까? 자물쇠 또는 기타 이와 같은 일련의 값을 조작하여 어떤 것입니까? – cornercuttin

+0

자식 테이블이 부모 테이블과 동일한 순서를 사용하므로 아무 문제가 없습니다 – Tometzky

+0

아니요, 이는 법적으로 법적 조치입니다. 자식들에게 발사되는 불이행은 우연히 이어질 수 있기 때문에 원래 그렇게했습니다 .. 재미있는 것들. 제대로하지 않으면 :-) –

2

이 코드가 시퀀스를 하나씩 만 증가 시키더라도 시퀀스에서 초기화 된 열에 간격이없는 것은 일반적으로 계산할 수 없습니다. begin; insert into foo (...); abort은 트랜잭션이 중단 되더라도 증가 된 시퀀스를 남겨 둡니다. .

A. Elein Mustain은 how to create a gapless sequence을 보여줍니다.