PostgreSQL分区创建报错:无法为分区关系指定默认表空间
无默认表空间修改权限时创建PostgreSQL分区表的方法
问题场景
尝试创建哈希分区表,执行以下SQL:
CREATE TABLE IF NOT EXISTS myBd.test_table ( id SERIAL PRIMARY KEY, name VARCHAR(50) NOT NULL, age INT NOT NULL ) PARTITION BY hash (id);
触发报错:
ERROR: cannot specify default tablespace for partitioned relations
查询数据库默认表空间:
SELECT datname, dattablespace FROM pg_database WHERE datname = 'myDb';
返回结果:
dattablespace = 16000
因无修改默认表空间的权限,需另寻创建分区表的方法。
解决方案
- 查询当前用户可使用的表空间
先确认哪些表空间是当前用户有权限访问的:
SELECT spcname FROM pg_tablespace WHERE has_tablespace_privilege(current_user, oid, 'USAGE');
通常pg_default是所有用户都有权限使用的默认表空间。
- 显式指定表空间创建分区表
在创建分区表的SQL中添加TABLESPACE子句,指定一个你有权限的表空间(比如pg_default):
CREATE TABLE IF NOT EXISTS myBd.test_table ( id SERIAL PRIMARY KEY, name VARCHAR(50) NOT NULL, age INT NOT NULL ) PARTITION BY hash (id) TABLESPACE pg_default;
- 创建分区时的注意事项
后续创建该分区表的子分区时,若需要也可以显式指定表空间;如果不指定,子分区会继承父分区表的表空间设置,无需额外操作。
原理说明
报错原因是数据库默认表空间被修改为你无权限访问的空间,而分区表默认会尝试使用数据库的默认表空间。显式指定有权限的表空间后,就能绕过默认表空间的限制完成创建。
内容的提问来源于stack exchange,提问作者Александр
相关产品推荐
相关产品推荐

