2016-07-27 2 views
0
나는 역사와 관련된 최신 ID를 얻기 위해 PostgreSQL을의 기능을 사용하려면

얻을 포스트 그레스 당신이 물어 전에 - 당신이 알 것이기 때문에 recusive 기능은 최신 ID

CREATE FUNCTION get_lastes_id(ID oid, newID oid) RETURNS oid AS $$ 
BEGIN 
    IF new IS NOT NULL THEN 
    --USE old--  
    END 
    IF new IS NULL THEN 
    get_latest_id(new, "newID") 
    END 
END; 

내가 그것을 말할 돼 .... 기능,하지만 난거야 그는 미래에 두 개 이상의 부모-ID가 나는 COALESCE()에 대해 알고 어쨌든 : 필자는 Postgresql의 기능이 정말 새롭고 이것이 가능한지 확실하지 않습니다. 그러나 COALESCE()를 가정 할 때 - 함수는 또한 제외 된 서버 측 함수 여야합니다./

+1

처음에는 oids를 사용하면 안됩니다. 어떤 문제를 해결하려고합니까? –

답변

0

먼저, 사용자가 묻는 것이 명확하지 않습니다. oid는 아마도 시스템 라이브러리를 위해 고안된 내부 유형이기 때문에 아마도 가장 좋은 유형이 아니므로 예상 한대로 작동 할 것이라고 보장 할 수는 없습니다.

두 번째로 나에게 이것은 최신 정보를 얻기 위해 재귀를 사용하려는 경우 나에게 좋지 않은 선택 도구로 보입니다. 일이 잘 수행되기를 원한다면, 희소 한 알고리즘보다는 집합 연산으로 생각해보십시오.

당신이 트리거가 이름에 대한 최신 (최대) OID를 가져온 다음에 "NEWID"을 지정하려면 :

OID를과의 int와 함께 작동
CREATE OR REPLACE FUNCTION set_newID() RETURNS TRIGGER LANGUAGE PLPGSQL AS 
$$ 
DECLARE maxid oid; 
BEGIN 
    IF new."newID" IS NOT NULL THEN 
      RETURN new; -- do nothing 
    END IF; 
    SELECT max("ID") INTO maxid FROM tbl_ids WHERE "Name" = new."Name"; 
    new."newID" = maxid; 
    RETURN new; 
END;  
$$; 

. 그러나 트리거에 의해 수정 된 각 행의 db에서 행을 선택해야하므로 대량 삽입과 같은 성능 문제가 발생할 수 있습니다.

아, 모든 소문자를 사용하면 모든 식별자를 인용 할 필요가 없습니다.

+0

thx 답을 위해, 나는 더 이상 oids를 사용하지 않을 것이다 :) 하지만 내 문제는 분명하지 않을 것 같다 : 나는 COALESCE()와 같은 함수가 필요하다 - COALESCE (newID, ID)와 같은 함수 : IF newID = NULL 그런 다음 ID를 사용하십시오. IF newID! = NULL 그런 다음 newID와 COALESCE()를 사용하십시오 - newID가 ID로 설정되고 newID가 행에서 다시 사용됩니다. – user2823842

+0

나무를 가로 지르려고하십니까? 아니면 그래프? 방아쇠로? 왜? –

+0

첫 번째이지만 트리거가 아니며 COALESCE()와 유사한 함수입니다. 신분증은 교환 할 수 없으므로 필요합니다. 역사적인 구덩이에 끝나기 때문에 필요합니다. 더 이상 이것이 서버 측 함수가 될지 모르겠다. 이것은 단순한 while 루프로 미들웨어에서 종료 될 것이라고 생각한다. ... – user2823842