【问题标题】:How do I restrict the number of rows in a table for a specific column value?如何限制特定列值的表中的行数?
【发布时间】:2014-12-14 03:51:57
【问题描述】:

我正在尝试在 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();

当我尝试插入一行时,请告诉我:

错误:执行到达触发过程的结尾,但没有找到 RETURN 上下文:PL/pgSQL 函数 contar_dest()

现在我做我想做的事,但现在的错误是:

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 **********

【问题讨论】:

  • 您的查询中没有 ELSE,因此当 IF 为 false 时您不会返回任何内容。
  • 谢谢,你说得对。

标签: postgresql triggers


【解决方案1】:

错误是由于您使用的语法要求最多 1 行,但执行时返回很多。

变化:

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

收件人:

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

= 仅适用于 1 个值,但 IN 允许多个值。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-02-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多