2014-12-14 4 views
0

postgreSQL에서이 작업을 수행하려고합니다. 5 개 이상의 레코드 (행)를 저장할 수 없습니다.특정 열 값에 대해 테이블의 행 수를 제한하려면 어떻게합니까?

CREATE FUNCTION contar_dest() 
RETURNS TRIGGER AS 
$body$ 
BEGIN 
IF (SELECT COUNT(ID) FROM "LUGARES" WHERE demanda is not null) > 5 
THEN 
DELETE FROM "LUGARES" 
WHERE ID = (SELECT max(ID) FROM "LUGARES"); 
RETURN NULL; 
END IF; 
END; 
$body$ 
LANGUAGE plpgsql; 

CREATE TRIGGER contar 
AFTER INSERT 
ON "LUGARES" 
FOR EACH ROW 
EXECUTE PROCEDURE contar_dest(); 

내가 삽입 할 때 행은 저에게이 보여 내가 PL/pgSQL의 기능 contar_dest()

지금 :

ERROR : 실행 RETURN에게 문맥을 찾는없이 트리거 절차의 끝에 도달을 내가 원하지만 오류이 지금 뭘 :

CREATE FUNCTION contar_dest() 
RETURNS TRIGGER AS 
$body$ 
BEGIN 
IF ((SELECT COUNT(ID) FROM "LUGARES" WHERE demanda is not null) > 5) THEN 
DELETE FROM "LUGARES" 
WHERE ID = (SELECT NEW.ID FROM "LUGARES"); 
ELSIF ((SELECT COUNT(ID) FROM "LUGARES" WHERE demanda is not null) < 5) THEN 
RETURN NULL; 
END IF; 
RETURN NULL; 
END; 
$body$ 
LANGUAGE plpgsql; 


CREATE TRIGGER contar 
AFTER INSERT 
ON "LUGARES" 
FOR EACH ROW 
EXECUTE PROCEDURE contar_dest(); 

INSERT INTO "LUGARES"(
     nombre, demanda) 
VALUES ('Valencia',2000); 

ERROR: a subquery used as an expression returned more than one record 
CONTEXT : SQL statement : " DELETE FROM "LUGARES" 
    WHERE ID = (SELECT FROM NEW.ID "LUGARES") » 
PL/pgSQL contar_dest () function in line 4 SQL statement 
********** Error ********** 
+1

검색어에 ELSE가 없으므로 IF가 거짓 일 때 아무 것도 표시하지 않습니다. –

+0

고마워, 네 말이 맞아. –

답변

0
오류는 1 행의 최대 요구 구문을 사용하여 발생

하지만, EXE cuted는 많은 것을 반환합니다.

변경 :

DELETE FROM "LUGARES" 
WHERE ID = (SELECT NEW.ID FROM "LUGARES"); 

사람 :

DELETE FROM "LUGARES" 
WHERE ID IN (SELECT NEW.ID FROM "LUGARES"); 

=은 1 개 값으로 작동하지만, IN 많은 값을 허용합니다.

+0

도움을 주셔서 감사합니다. 코드가 준비되었습니다! –

관련 문제