PostgreSQL驼峰序列设置报错:relation不存在问题求助
解决PostgreSQL setval报错“relation does not exist”的问题
我之前也踩过这个一模一样的坑!你遇到的问题大概率是序列的完整限定名(schema+序列名)没写对,或者当前会话的搜索路径没包含序列所在的模式。下面一步步给你解决:
1. 先搞清楚序列的完整归属
你之前的查询只拿到了序列的名字,但PostgreSQL里的对象(表、序列)都是属于某个schema的(默认是public)。先查一下序列的完整路径:
SELECT c.relname AS sequence_name, n.nspname AS schema_name FROM pg_class c JOIN pg_namespace n ON c.relnamespace = n.oid WHERE c.relkind = 'S' AND c.relname LIKE '%tableName_id_seq%';
执行后你会看到类似这样的结果:
| schema_name |
|---|
| public |
这就明确了序列在哪个schema下。
2. 使用完整限定名调用setval
知道了schema之后,把它加到序列名前面,注意标识符的大小写规则:
- 如果你的序列名是创建时没加双引号的(默认小写),用单引号包裹完整名称即可:
SELECT setval('public.tableName_id_seq', (SELECT MAX(id) FROM "tableName"));
- 如果你的序列名是带大小写的(创建时用了双引号),那必须用双引号包裹整个限定名:
SELECT setval("public.tableName_id_seq", (SELECT MAX(id) FROM "tableName"));
3. 更省心的方法:自动获取序列名
其实不用手动查序列名,PostgreSQL提供了pg_get_serial_sequence函数,可以直接根据表和字段找到对应的序列,完美避开schema和大小写的问题:
SELECT setval(pg_get_serial_sequence('"tableName"', 'id'), (SELECT MAX(id) FROM "tableName"));
这个方法最推荐,不管你的表在哪个schema,序列名是什么格式,都能准确找到。
4. 排查搜索路径(可选)
如果还是报错,检查一下当前会话的搜索路径,看看序列所在的schema是否在里面:
SHOW search_path;
如果结果里没有序列的schema,可以临时添加:
SET search_path TO public, your_schema_name;
不过更推荐用完整限定名或者上面的自动获取方法,避免依赖搜索路径。
内容的提问来源于stack exchange,提问作者Karl Adler
相关产品推荐
相关产品推荐

