我有要导入到新系统中的现有数据。
我想根据现有表的长度设置序列。我尝试了这个,但得到了number == 1
。
DO
$do$
DECLARE
_tbl text;
number int;
BEGIN
FOR _tbl IN
SELECT c.relname FROM pg_class c WHERE c.relkind = 'S' and c.relname ilike '%y_id_seq'
LOOP
-- EXECUTE
SELECT count(*) FROM regexp_replace(_tbl, '(\w)y_.*', '\1ies') INTO number;
RAISE NOTICE '%', number;
EXECUTE format('SELECT setval(''"%s"'', ''%s'' )', _tbl, number);
END LOOP;
END
$do$;
我应该怎么做才能获得正确的计数?
答案 0 :(得分:1)
COUNT(*)
不是新序列值的最佳选择。试想一下,您的编号存在漏洞,例如1, 2, 15
。 Count
为3
,但下一个值应为16
,以免将来重复。
假设您对id
列使用序列,我建议:
SELECT max(id) FROM _table_name_ INTO number;
或更简单:
SELECT setval(_sequence_name_, max(id)) FROM _table_name_;