赞
踩
OS:Linux Centos7
PostgreSQL: 14.10
sudo yum install -y https://download.postgresql.org/pub/repos/yum/reporpms/EL-7-x86_64/pgdg-redhat-repo-latest.noarch.rpm
sudo yum install -y postgresql14-server
初始化并启用PG
sudo /usr/pgsql-14/bin/postgresql-14-setup initdb
sudo systemctl enable postgresql-14
sudo systemctl start postgresql-14
查看pg的状态,如果是 active 说明启动成功
sudo systemctl status postgresql-14
使用搜索命令找到对应的配置文件
find / -name pg_hba.conf
编辑文件,将所有ip放开
vi /var/lib/pgsql/14/data/pg_hba.conf
在文件末尾加上
# all user access
host all all 0.0.0.0/0 trust
参数一: 类型(local, host, hostssl) 本地连接,外部连接,ssl加密连接
参数二: 数据库名称 填写需要连接的数据库名称 all表示所有
参数三: Linux用户 填写能访问的用户 all表示所有用户
参数四: ip地址 可以访问的ip地址 0.0.0.0/0表示所有地址
参数五: “trust”, “reject”, “md5”, “password”, “scram-sha-256”, “gss”, “sspi”, “ident”, “peer”, “pam”, “ldap”, “radius” ,“cert”
查找文件位置
find / -name postgresql.conf
编辑文件,将所有ip放开
vi /var/lib/pgsql/14/data/pg_hba.conf
将地址设置成所有地址可以访问
# - Connection Settings -
listen_addresses = '*'
修改两个配置文件后,重启数据库
systemctl restart postgresql-14
默认用户名是 postgres, 密码为空
切换到 postgres 用户
su - postgres
进入pg
psql
进入PG后执行
alter role postgres with password '密码';
重启数据库
systemctl restart postgressql-14
默认没有密码,直接设置为空即可
使用Navicat的数据传输功能
在PG中创建一个同名的库
选择运行期间的全部表
并勾选遇到错误时继续和创建前删除目标对象
点击开始,等待数据传输完成
MySQL中不同表中的索引名称可以重复,但是PostgreSQL中不能重复
这就会导致部分索引会丢失,需要手动给PostgreSQL中表的字段添加索引
MySQL中的数据通过navicat传输到PostgreSQL中默认值会丢失,主键的默认自增也会丢失
通过自定义一个序列,并加入到主键上来解决自增问题
CREATE SEQUENCE table_a INCREMENT 1 MINVALUE 1 MAXVALUE 99999999999 START WITH 1 CACHE 1;
ALTER TABLE table_a ALTER COLUMN ID SET DEFAULT nextval( 'table_a_id_seq');
序列参数
INCREMENT 自增数量
MINVALUE 最小值
MAXVALUE 最大值
STRAT WITH 开始位置
CACHE 确定有多少序列号被预先分配,并存储在内存中以便更快地访问
序列函数
nextval('test_seq') --获取下一个序列值,并自增
currval('test_seq'); --获取当前序列值
setval('test_seq', 1) -- 设置序列值
select setval('test_seq', (select max(id) from test)); --将当前最大id设置为当前序列值
一键生成主键序列,并设置最大id到序列上
-- 为主键创建序列,并设置序列值为当前id
SELECT
concat ( 'CREATE SEQUENCE ', TABLE_NAME, '_id_seq INCREMENT 1 MINVALUE 1 MAXVALUE 99999999999 START WITH 1 CACHE 1;
ALTER TABLE "', TABLE_NAME, '" ALTER COLUMN ID SET DEFAULT nextval(#', TABLE_NAME, '_id_seq#);
', 'select setval(#', TABLE_NAME, '_id_seq#, ', '(select max(id) from ', TABLE_NAME, '));' )
FROM
information_schema.tables
WHERE
table_schema = 'public'
AND table_type = 'BASE TABLE'
ORDER BY
TABLE_NAME;
复制生成SQL,将#全局替换成单引号,执行SQL来生成序列
引入PostgreSQL的依赖
<dependency>
<groupId>org.postgresql</groupId>
<artifactId>postgresql</artifactId>
<scope>runtime</scope>
</dependency>
在配置文件中配置
driver-class-name: org.postgresql.Driver
url: jdbc:postgresql://192.168.253.100:5432/banew?autoReconnect=true&autoReconnectForPools=true&useUnicode=true&characterEncoding=utf8&createDatabaseIfNotExist=true&allowMultiQueries=true&zeroDateTimeBehavior=convertToNull
username: postgres
password: ''
由于MySQL的Limit和PostgreSQL的Limit语法不一样,分页插件需要设置成PostgreSQL的模式
@Bean
public MybatisPlusInterceptor mybatisPlusInterceptor() {
MybatisPlusInterceptor mybatisPlusInterceptor = new MybatisPlusInterceptor();
//mybatisPlusInterceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));
mybatisPlusInterceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.POSTGRE_SQL));
return mybatisPlusInterceptor;
}
这里只展示在mybatis mapper中需要更改的语法
差异项 | MySQL | PostgreSQL |
---|---|---|
字段标识符 | `name | “name” |
limit | limit(x, y) | limit x * y offset y |
非空判断 | IFNULL(a,0) | COALESCE(a,0) |
日期格式化 | date_format(date, ‘%Y年%m月’) | to_char(date, ‘YYYY年MM月’) |
日期减 | DATE_SUB(date, interval 1 MONTH) | date + INTERVAL ‘1 month’ |
日期加 | DATE_ADD(date, interval 1 DAY) | date - INTERVAL ‘1 day’ |
在MySQL中,传入string类型的值与int比较会正常运行(或者数据更新插入)
而在PostgreSQL中,会报错
错误: 操作符不存在: integer = character varying
Hint: 没有匹配指定名称和参数类型的操作符. 您也许需要增加明确的类型转换.
-- 是否将日志重定向至文件中,默认是off
alter system set logging_collector = 'on';
-- 日志目录位置 PGDATA的相对路径,即PGDATA的相对路径,即{PGDATA}/pg_log
alter system set log_directory = 'pg_log';
-- -1示不可用,0将记录所有SQL语句和它们的耗时,>0只记录那些耗时超过(或等于)这个值(ms)的SQL语句。
alter system set log_min_duration_statement = '1000';
-- 日志文件名称 最多保存一周的日志,每天一个文件
alter system set log_filename = 'postgresql-%w.log';
-- 单个日志的最大大小 超过另生成文件
alter system set log_rotation_size = '1024MB';
-- 开启自定义日志文件名
alter system set log_truncate_on_rotation = 'on';
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。