Я потратил час, пытаясь получить ответ djsnowsill для работы с базой данных, используя таблицы и столбцы в смешанном регистре, а затем, наконец, наткнулся на решение благодаря комментарию от Мануэля Дарво, но я подумал, что могу сделать его немного понятнее для всех :
CREATE OR REPLACE FUNCTION "reset_sequence" (tablename text, columnname text)
RETURNS "pg_catalog"."void" AS
$body$
DECLARE
BEGIN
EXECUTE format('SELECT setval(pg_get_serial_sequence(''%1$I'', %2$L),
(SELECT COALESCE(MAX(%2$I)+1,1) FROM %1$I), false)',tablename,columnname);
END;
$body$ LANGUAGE 'plpgsql';
SELECT format('%s_%s_seq',table_name,column_name), reset_sequence(table_name,column_name)
FROM information_schema.columns WHERE column_default like 'nextval%';
Это имеет преимущество:
- не предполагая, что столбец идентификатора написан определенным образом.
- не предполагая, что все таблицы имеют последовательность.
- работает для имен таблиц / столбцов в смешанном регистре.
- используя формат, чтобы быть более кратким.
Чтобы объяснить, проблема заключалась в том, что pg_get_serial_sequence
использует строки для определения того, что вы имеете в виду, так что если вы делаете:
"TableName" --it thinks it's a table or column
'TableName' --it thinks it's a string, but makes it lower case
'"TableName"' --it works!
Это достигается с помощью ''%1$I''
в строке формата, ''
делает апостроф 1$
означает первый аргумент, а I
означает кавычки