有没有办法设置PostgreSQL数据库的最大行数?
问题很简单。有没有办法动态限制Postgres数据库的最大行数 我认为这是不可能的,直到我看到赫罗库做到了。经过一些研究,我找到了一种使用触发器的方法:有没有办法设置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) &
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。我希望将存储在整个数据库(而不仅仅是一个表)上的行数限制为动态值。