我們在我們的數據庫中有一個監視器來檢查接近max-int或max-bigint的id。我們剛剛從MySQL遷移而來,並且很努力地在PostgreSQL上獲得類似的檢查。我希望有人能幫忙。獲取PostgreSQL中所有序列的最大ID
這裏的查詢在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某種方式添加到每個記錄,使我在[表名,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
哪個版本的Postgres? –
Postgres版本9.2 –