我们在我们的数据库上有一个监视器来检查接近 max-int 或 max-bigint 的 id。我们刚从 MySQL 搬来,我正在努力在 PostgreSQL 上进行类似的检查。我希望有人能帮忙。
这是MySQL中的查询
SELECT table_name, auto_increment FROM information_schema.tables WHERE table_schema = DATABASE();
我试图从 PostgreSQL 获得相同的结果。我们找到了一种方法,通过对数据库的大量调用,分别检查每个表。
我只想对数据库进行 1 次调用。这是我到目前为止所拥有的:
CREATE OR REPLACE FUNCTION getAllSeqId() RETURNS SETOF record AS
$body$
DECLARE
sequence_name varchar(255);
BEGIN
FOR sequence_name in SELECT relname FROM pg_class WHERE (relkind = 'S')
LOOP
RETURN QUERY EXECUTE 'SELECT last_value FROM ' || sequence_name;
END LOOP;
RETURN;
END
$body$
LANGUAGE 'plpgsql';
SELECT last_value from getAllSeqId() as(last_value bigint);
但是,我需要以某种方式将 sequence_name 添加到每条记录中,以便在 [table_name, last_value] 或 [sequence_name, last_value] 的记录中获得输出。
所以我想这样称呼我的函数:
SELECT sequence_name, last_value from getAllSeqId() as(sequence_name varchar(255), last_value bigint);
我怎样才能做到这一点?
编辑:在 ruby 中,这会创建我们正在寻找的输出。如您所见,我们执行 1 次调用以获取所有索引,然后对每个索引执行 1 次调用以获取最后一个值。应该是更好的方法。
def perform
find_auto_inc_tables.each do |auto_inc_table|
check_limit(auto_inc_table, find_curr_auto_inc_id(auto_inc_table))
end
end
def find_curr_auto_inc_id(table_name)
ActiveRecord::Base.connection.execute("SELECT last_value FROM #{table_name}").first["last_value"].to_i
end
def find_auto_inc_tables
ActiveRecord::Base.connection.execute(
"SELECT c.relname " +
"FROM pg_class c " +
"WHERE c.relkind = 'S'").map { |i| i["relname"] }
end