最近在学习AWS的Redshift,它是基于PostgreSQL
的,顺便学习下。
安装PostgreSQL
配置
- 默认端口为5432,默认用户名为
postgres
系统表
pg_class
: 记录数据库中的表,索引及视图pg_namespace
: 记录数据库中的名字空间pg_attribute
: 记录数据库中表的字段的详细信息。(attname
字段名字,atttypid
字段类型id,attlen
字段长度,attnotnull
)pg_type
: 记录数据库中所有的数据类型pg_description
: 记录数据库中对象的注释(表以及字段)。(objoid
对象ID,objsubid
字段号,description
描述)
索引
- Redshift不能像PostgreSQL那样创建索引,但是提供了一个类似的功能
sort key
,该功能可以和传统数据库一样能够优化存储与查询方面的性能
系统管理
1 | SELECT version(); # 获取数据库版本 |
增删该查
数据库操作
1 | postgres shell中执行 |
数据表操作
- PostgreSQL中的数据类型
- 如果是自增类型,从10开始推荐使用
IDENTITY
。之前是用serial/serial8
类型
1 | # 使用表名查询表字段的定义 |
数据操作
查询记录
1 | SELECT * FROM COMPANY LIMIT 3 OFFSET 2; # 分页操作,limit操作 |
新增记录
更新记录
删除记录
事务
1 | BEGIN; |
TroubleShooting
ProgrammingError: Statement is too large. Statement Size: 40000000 bytes. Maximum Allowed: 16777216 bytes: 这是因为
PostgreSQL
默认设置最大的sql语句为16M,所以尽量一条语句的大小尽量控制在这之下Permission denied for relation: 那是因为该用户没有表的访问权限,可以这样做:
1
2GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA public to test; # 分配所有公共表权限
GRANT ALL PRIVILEGES ON TABLE table-name TO test; # 分配指定表的权限Unique violation: 7 ERROR: duplicate key value violates unique constraint “users_pkey”
尝试执行以下命令重置一下主见索引,原理见stackoverflow:1
SELECT setval(pg_get_serial_sequence('users', 'id'), coalesce(max(id)+1, 1), false) FROM users;
must appear in the GROUP BY clause or be used in an aggregate function(列必须出现在group by子句中或聚合函数中): postgresql一个非常常见的问题,常常在使用聚合函数的时候出现,例如count。没有啥一劳永逸的解决方法,反正遇到这种问题,它让你加哪个列到group by里面就加进去吧,一定要看看sql的输出结果,看看是不是自己想要的。(这个才是sql的标准,mysql没有完全执行。。。)