有没有办法设置PostgreSQL数据库的最大行数?

有没有办法设置PostgreSQL数据库的最大行数?,postgresql,heroku-postgres,Postgresql,Heroku Postgres,问题很简单。有没有办法动态限制Postgres数据库的最大行数 我认为这是不可能的,直到我看到赫罗库做到了。经过一些研究,我找到了一种使用触发器的方法: CREATE OR REPLACE FUNCTION check_number_of_row() RETURNS TRIGGER AS $body$ BEGIN -- replace 100 by the number of rows you want IF (SELECT count(*) FROM your_table) &

问题很简单。有没有办法动态限制Postgres数据库的最大行数

我认为这是不可能的,直到我看到赫罗库做到了。经过一些研究,我找到了一种使用触发器的方法:

CREATE OR REPLACE FUNCTION check_number_of_row()
RETURNS TRIGGER AS
$body$
BEGIN
    -- replace 100 by the number of rows you want
    IF (SELECT count(*) FROM your_table) > 100
    THEN 
        RAISE EXCEPTION 'INSERT statement exceeding maximum number of rows for 
this table' 
    END IF;
END;
$body$
LANGUAGE plpgsql;

CREATE TRIGGER tr_check_number_of_row 
BEFORE INSERT ON your_table
FOR EACH ROW EXECUTE PROCEDURE check_number_of_row();
但这不是我需要的。它将一个表的行数限制为一个静态的最大数,因此我必须遍历所有的表,这看起来是一个相当混乱的选项。我甚至没有想过如何动态设置这个最大值

我想做每日/每周的cron工作来检查所有数据库,计算总行数,看看是否在限制范围内,但如果有更有效的方法,我会接受

我认为这是不可能的,直到我看到赫罗库做到了

这并不完全准确。Heroku嗜好层的数据库行限制没有严格限制。换句话说,当您在hobby dev或hobby basic中超过10k或10M行时,不会立即停止写入。Heroku通过电子邮件提供7天的时间窗口,使计数低于配额,否则将阻止写入访问。如果你的目的只是为了提高警惕并进行相应的调整,那么他们已经有了一个很好的系统

然而,关于你的问题,考虑到Heroku Postgres(特别是业余爱好数据库)是相当封闭的,我不认为你会有必要的控制水平来实现你所追求的,而不会使它比你的问题更混乱。

因为
选择计数(*)
是一个非常昂贵的操作,我不认为在每次数据更改时都运行它是一个好主意。此外,行数不会告诉您多少关于表的大小

我的方法是使用触发器,使用
pg\u total\u relation\u size()
如下所示:

CREATE OR REPLACE FUNCTION size_trig() RETURNS trigger
   LANGUAGE plpgsql AS
$$BEGIN
   IF pg_total_relation_size(TG_RELID) > (TG_ARGV[0])::bigint THEN
      RETURN NULL;
   ELSE
      RETURN NEW;
   END IF;
END;$$;

CREATE TRIGGER size_trig BEFORE INSERT ON big
   FOR EACH ROW
   EXECUTE PROCEDURE size_trig(819200);
这将把包括索引和TOAST表在内的表的总大小限制在100个块以内,而且相对便宜

您仍然需要为所有要检查的表定义触发器,但是除了修改PostgreSQL之外,没有其他方法可以解决这个问题


您可以看到,可以为每个表动态设置限制。您还可以提出一种解决方案,使用查找表来确定大小限制。

欢迎使用StackOverflow(SO)。我想澄清一下--我不太确定你在问什么。是否要限制存储在数据库中的行数,或限制从数据库查询返回的记录数?@GregT。我希望将存储在整个数据库(而不仅仅是一个表)上的行数限制为动态值。