超全mysql转换postgresql数据库方案

写在前文:

近期由于公司业务产品发展需要,要求项目逐渐国产化:(1)项目国产操作系统部署;(2)数据库国产化;国产数据库最终选型为highgo(瀚高),该数据库基于pg开发,所以要求先将mysql适配到postgresql数据库;

一、初识postgresql

1.1 docker安装postgresql

1.1.1 镜像拉取

dockerhub官网选取自己想安装的版本(https://hub.docker.com/_/postgres/tags),我这里选取的是13.9版本;

拉取镜像到本地

docker pull postgres:13.9

1.1.2 执行镜像安装postgresql

docker run --name 1.postgres \
--restart=always \
-e POSTGRES_PASSWORD='jY%kng8cc&' \
-p 5432:5432 \
-v /data/postgresql:/var/lib/postgresql/data \
-d postgres:13.9

1.1.3 创建数据库,设置默认查询模式

-- 建库
CREATE DATABASE "test"
WITH
  OWNER = "testuser" -- 数据库用户
;

-- 创建模式
CREATE SCHEMA "test" AUTHORIZATION "test";

-- 设置默认查询模式 pg连接时默认使用public这个schmel,想让项目连接时使用自己创建的模式需要修改一下默认查询模式
ALTER ROLE testuser SET search_path="test";

1.2 postgresql学习

这里放上一个学习地址,大家可以参照性学习,边使用边学习

https://www.sjkjc.com/postgresql/psql-commands/

1.3 项目中引入postgresql数据库

1.3.1 版本问题

postgresql-42.2.10(支持PostgreSQL 42)

  • JDK 8 - JDBC 4.2 Support for JDBC4 methods is not complete,but the majority of methods are implemented.

pg驱动版本:springboot2.5.14中默认集成的是42.2.25

1.3.2 添加maven依赖

<dependency>
   <groupId>org.postgresql</groupId>
   <artifactId>postgresql</artifactId>
   <scope>runtime</scope>
</dependency>

1.3.3 配置文件修改

# 1.postgres为容器名称,也可以直接指定ip
pring.datasource.url=jdbc:postgresql://1.postgres:5432/test?autoReconnect=true&autoReconnectForPools=true&useUnicode=true&characterEncoding=utf8&createDatabaseIfNotExist=true&allowMultiQueries=true&zeroDateTimeBehavior=convertToNull
spring.datasource.username=testuser
spring.datasource.password=test
spring.datasource.driver-class-name=org.postgresql.Driver

二、 MYSQL和PG基础语法差异汇总整理

2.1 数据结构对比

mysql

postgresql

TINYINT

SMALLINT

SMALLINT

SMALLINT

MEDIUMINT

INTEGER

BIGINT

BIGINT

FLOAT

REAL

DOUBLE

DOUBLE PRECISION

BOOLEAN

BOOLEAN

TINYTEXT

TEXT

TEXT

TEXT

MEDIUMTEXT

TEXT

LONGTEXT

TEXT

BINARY(n)

BYTEA

VARBINARY(n)

BYTEA

TINYBLOB

BYTEA

BLOB

BYTEA

MEDIUMBLOB

BYTEA

LONGBLOB

BYTEA

DATE

DATE

TIME

TIME [WITHOUT TIME ZONE]

DATETIME

TIMESTAMP [WITHOUT TIME ZONE]

TIMESTAMP

TIMESTAMP [WITHOUT TIME ZONE]

AUTO_INCREMENT

SERIAL,BIGSERIAL

column ENUM (value1,value2,[…]

column VARCHAR(255) NOT NULL,CHECK (column IN (value1,[…])) pg可以自定义数据类型实现类似效果: CREATE TYPE mood AS ENUM ('sad','ok','happy'); CREATE TABLE person ( current_mood mood ... )

2.2 基础语法差异对比

语法差异

mysql

postgresql

是否相同

分页

select * from t1 limit 2,2;

select * from tbl limit 2 offset 2;

插入数据时:如果不存在则insert,存在则update

replace实现

upsert

大小写兼容

通过配置可兼容

表字段或表名为大写时,字段或表名必须添加双引号

if(),case when

if(),case when 条件1 then 符合值 else 不符合值 end;

case when 条件1 then 符合值 else 不符合值 end;

round(字段,小数位数)

round(字段,小数位数)

round(case(‘字段’ as numeric),小数位数)

null值判断

支持 ifnull(),NVL(),COALESCE()

支持COALESCE()

Update-单表更新

相同

相同(不可全表更新)

update-更新单表多个字段

相同

相同

update-更新并返回

select tem1,tem2 from update test set tem1 = '',tem2 = ''

UPDATE test SET tem1 = '',tem2 = '' RETURNING tem2,tem2;

Update表关联更新

相同

相同

Insert-单行插入

相同

相同

Insert-插入指定字段

相同

相同

insert-插入多行

相同

相同

insert-插入并返回

不支持

INSERT INTO() RETURNING did

Insert-插入,存在则更新

INSERT INTO () VALUE() ON DUPLICATE KEY UPDATE name = EXCLUDED.name

INSERT INTO distributors ( did,dname ) VALUES ( 9,' Antwerp Design' ) ON CONFLICT (did)DO UPDATE SET name = EXCLUDED.name

insert-不存在插入,存在更新

replace实现

upsert语句

SELECT

相同

相同

DELETE

DELETE FROM table

DELTE FROM table(不可全表删除)

DELETE

DELETE FROM table WHERE

DELETE FROM table WHERE

DELETE-删除并返回

不支持

DELETE FROM table WHERE RETURNING * ;

INDEX-add

支持alter,create创建

支持create

INDEX-delete

支持alter,drop

支持drop

字符串常量

支持单双引号

支持双引号

插入数据时自增主键

写法一:insert into t1(name) values(‘zhangshan’); 写法二:insert into t1(id,name) values(null,‘zhangshan’);

insert into t1(name) values(‘zhangshan’);

库名长度

无强制限制

库名、表名限制命名长度,建议表名及字段名字符总长度小于等于63。

三、MYSQL数据结构转换PG数据结构

3.1 mysql数据结构转换PG数据结构

网上有很多转换工具,有些需要收费,这里借助一个最简单最常用的工具-navicat premium(我这里使用的是16版本)转换mysql数据结构到PG的数据结构

点击database选择你想转换的数据库,这里选择postgreSQL,下面选择版本

至此,一份pg的数据结构就保存完整了(注意:此时转换出来的数据结构会存在一些错误,还需要额外手动处理一些问题)

3.2 MYSQL转换PG数据结构存在的问题及解决方案

3.2.1 默认值丢失问题default

(1)时间字段的CURRENT_TIMESTAMP默认值丢失

解决方案:

-- 从mysql默认表information_schema中获取默认为CURRENT_TIMESTAMP列的信息
SELECT TABLE_NAME,column_name,column_default,extra FROM information_schema.columns
WHERE  table_schema = 'bigdata-web' and column_default is not null AND column_default = 'CURRENT_TIMESTAMP';

-- 拼接所有时间字段默认为CURRENT_TIMESTAMP的alter 语句,提取到脚本中执行
SELECT
CONCAT("ALTER TABLE \"bigdata-web\".\"",TABLE_NAME,"\" ALTER COLUMN ","\""," SET DEFAULT ",";")
FROM information_schema.columns
WHERE
table_schema = 'bigdata-web' and column_default is not null AND column_default = 'CURRENT_TIMESTAMP';

(2)时间字段类型的on update CURRENT_TIMESTAMP,PG中无该使用方式

解决方案:

利用触发器和pg扩展函数实现更新数据时更新时间字段值

-- 安装pg扩展函数moddatetime(使用pg的useradmin用户)
create extension moddatetime;
ALTER FUNCTION "moddatetime"() OWNER TO "test用户";


-- 触发器语句:create trigger gmt_modified_timestamp_trigger before update on test_ly for each row execute procedure moddatetime(gmt_modified);
-- 查询所有设置了on update CURRENT_TIMESTAMP的列
SELECT TABLE_NAME,COLUMN_NAME,EXTRA,DATA_TYPE FROM information_schema.columns
WHERE  table_schema = 'bigdata-web' and  column_default is not null AND column_default != ''  AND column_default = 'CURRENT_TIMESTAMP' AND EXTRA = 'on update CURRENT_TIMESTAMP';

-- 拼接处理默认值为on update CURRENT_TIMESTAMP字段类型的默认值,添加触发器的语句
SELECT CONCAT("create trigger ","_trigger ","before update on \"","\" for each row execute procedure moddatetime(\"","\");") FROM information_schema.columns
WHERE  table_schema = 'bigdata-web' and  column_default is not null AND column_default != ''  AND column_default = 'CURRENT_TIMESTAMP' AND EXTRA = 'on update CURRENT_TIMESTAMP';

(3)其他默认值可以参考上面拼接处理,如字符串,数字

解决方案

-- 拼接所有默认值为字符串的alter语句
SELECT TABLE_NAME,DATA_TYPE,extra FROM information_schema.columns
WHERE  table_schema = 'bigdata-web' and  column_default is not null AND column_default != 'CURRENT_TIMESTAMP' AND DATA_TYPE = 'varchar' AND column_default != '';

SELECT 
CONCAT("ALTER TABLE \"bigdata-web\".\""," SET DEFAULT '","';")
FROM information_schema.columns
WHERE table_schema = 'bigdata-web' and  column_default is not null AND column_default != 'CURRENT_TIMESTAMP' AND DATA_TYPE = 'varchar' AND column_default != '';

-- 拼接默认值字段为enum的alter语句
SELECT * FROM information_schema.columns
WHERE  table_schema = 'bigdata-web' and  column_default is not null AND column_default != '' AND DATA_TYPE = 'enum';

SELECT 
CONCAT("ALTER TABLE \"bigdata-web\".\"","';")
FROM information_schema.columns
WHERE  table_schema = 'bigdata-web' and  column_default is not null AND column_default != '' AND DATA_TYPE = 'enum';

-- 查询默认值为数字的列,拼接alter语句 除了tinyint(1) TABLE_NAME,extra 
SELECT * FROM information_schema.columns
WHERE  table_schema = 'bigdata-web' and  column_default is not null AND column_default != 'CURRENT_TIMESTAMP' AND DATA_TYPE IN('tinyint','int','bigint') AND column_default != ''
AND COLUMN_TYPE != 'tinyint(1)' and 
table_name = 't_user'
SELECT 
CONCAT("ALTER TABLE \"bigdata-web\".\"",";")
FROM information_schema.columns
WHERE  table_schema = 'bigdata-web' and  column_default is not null AND column_default != 'CURRENT_TIMESTAMP' AND DATA_TYPE IN('tinyit','bigint') AND column_default != ''
AND COLUMN_TYPE != 'tinyint(1)';

-- double
SELECT * FROM information_schema.columns
WHERE  table_schema = 'bigdata-web' and  column_default is not null AND DATA_TYPE IN('double') AND column_default != '';

SELECT 
CONCAT("ALTER TABLE \"bigdata-web\".\"",";")
FROM information_schema.columns
WHERE  table_schema = 'bigdata-web' and  column_default is not null AND DATA_TYPE IN('double') AND column_default != '';

-- decimal
SELECT * FROM information_schema.columns
WHERE  table_schema = 'bigdata-web' and  column_default is not null AND DATA_TYPE IN('decimal') AND column_default != '';

SELECT 
CONCAT("ALTER TABLE \"bigdata-web\".\"",";")
FROM information_schema.columns
WHERE  table_schema = 'bigdata-web' and  column_default is not null AND DATA_TYPE IN('decimal') AND column_default != '';

(4)MYSQL的tinyint(1)(业务代码中boolean值)转换为了int2

navicat工具转换映射时将mysql的bit(1)转换为了int2,需要处理该部分字段

-- tinyint
SELECT * FROM information_schema.columns
WHERE  table_schema = 'test-database'  AND COLUMN_TYPE = 'tinyint(1)'
ORDER BY TABLE_NAME
-- 批量转换语句拼接

3.2.2 自增id设置丢失

navicat工具转换时将自增id设置丢失了

解决方案:

(1)修改建表语句,使用SERIAL关键字

(2)修改已经创建的表的某个字段为自增

--1、在PostgreSQL当中,我们实现ID自增首先创建一个关联序列,以下sql语句是创建一个从1开始的序列:
CREATE SEQUENCE menu_id_seq START 1;
--2、设置该字段默认值nextval('menu_id_seq'::regclass)
ALTER TABLE menu ALTER COLUMN id SET DEFAULT nextval('menu_id_seq'::regclass);

四、业务代码中的语法差异转换

4.1 常见修改场景汇总

序号

场景

示例

1

mapper接口方法上使用注解编写sql语句

@SELECT("SELECT * FROM TEST")

2

mapper的xml文件中的语句

3

mybatis-plus使用的实体类相关特殊列名修改

4

mybatis-plus使用QueryWrapper条件构造相关列修改

5

代码中使用字符串拼接的sql语句

4.2 业务代码语法修改问题汇总

序号

差异关键字

差异描述

mysql示例

pg示例

1

limit

limit 0,1 改成 limit 1 offset 0

select * from t_user limit 0,1

select * from t_user limit 1 offset 0

2

字段大小写

查询字段为驼峰命名,加上双引号,select \"startTime\" form ...

-

-

3

ifnull

没有ifnull函数,改用COALESCE()函数,

select ifnull(avatar,'aa'),"name" from t_user;

select COALESCE(avatar,"name" from t_user;

4

DATE_SUB()

没有DATE_SUB()时间计算函数,改用select now() + '1 seconds' 或 select now() + '-1 seconds'

select DATE_SUB(logintime,INTERVAL 1 DAY) from t_user;

select logintime + '1 days' from t_user;

5

别名大小写

查询字段的别名也需要用双引号包起来,select start_time as \"startTime\" from ...

-

-

6

正则表达式、REGEXP

正则表达式匹配,where taget_name ~ '^123$|asd'...,其中~为匹配正则表达式区分大小写,~*为不区分大小写,前面加叹号则为不匹配正则表达式如:!~

select * from t_user where name REGEXP '^adm*';

select * from t_user where name ~ '^adm*';

7

binary

mysql的where判断加上binary来区分大小写,where binary id = ‘abc’,在pg中是直接区分大小写的,将binary去掉就行

select * from t_user where binary name = 'ADMIN';

select * from t_user where name = 'ADMIN';

8

group_concat_max_len

set session group_concat_max_len=...在pg中没有,注释

-

-

9

GROUP_CONCAT()

GROUP_CONCAT()函数没有,使用array_to_string(array_agg(target_name),',') from ... 代替

select GROUP_CONCAT(industry) from t_company group by province;

select array_to_string(array_agg(industry),') from t_company group by province;

10

ISNULL

ISNULL没有使用is null来进行判断

select * from t_user where ISNULL(avatar);

select * from t_user where avatar is null;

11

&&,||

&&和||没有这个符号,用and和or替换

select * from t_user where ISNULL(avatar) && realname = '日志管理员';

select * from t_user where avatar is null and realname = '日志管理员';

12

date_format()

date_format()函数用不了,换成 to_char,select to_char(create_time,'yyyy-MM-dd hh24:mi:ss') from ...

select date_format(logintime,'%Y-%m-%d') from t_user;

select to_char(logintime,'yyyy-MM-dd') from t_user;

13

if()

没有if()函数,改用 case when 条件 then 值 else 值 end

select if(name = 'admin',true,false) as isAdmin from t_user

select case when name = 'admin' then true else false end as isAdmin from t_user

14

FIND_IN_SET()

where FIND_IN_SET('123',user_ids) ... 使用不了,换成 where '123' = ANY(string_to_array(user_id,')) ...

select * from t_company where find_in_set('浙江省',address);

select * from t_company where '浙江省' = ANY(string_to_array(address,'));

15

数字字符串比较、连表

mysql中能直接对数字和字符串进行=相等判断,pg不行,换成,'123' = cast(123 as VARCHAR) 或者 123 = cast('123' as INTEGER);或者123 = '123'::INTEGER

例如 select * from t_model_layout_task_record as r left join t_model_layout_form as f on r.formId = f.id,其中r.formId是vachar,f.id是int,这样连表是报错的,

改成:select * from t_model_layout_task_record as r left join t_model_layout_form as f on r.formId = cast(f.id as VARCHAR)

select * from t_model_layout_task_record as r left join t_model_layout_form as f on r.formId = f.id

select * from t_model_layout_task_record as r left join t_model_layout_form as f on r.formId = cast(f.id as VARCHAR)

16

SYSDATE()

没有 SYSDATE() 函数,换成 NOW()

select SYSDATE();

select now();

17

from_unixtime()

没有from_unixtime()函数,换成to_timestamp()

select from_unixtime(1673833489);

select to_timestamp(1673833489);

18

auto_increment

mysql查询information_schema.tables的auto_increment字段获取主键自增的值,而pg的information_schema.tables中不存在auto_increment。

pg通过该函数 pg_get_serial_sequence(‘库名.表名’,'自增字段名') 获取表的自增值

-

-

19

unix_timestamp()

没有unix_timestamp()函数,换成date_part('epoch',now())::integer,例如,select date_part('epoch',start_time)::integer from t_model_layout_task_record

select unix_timestamp(createtime) from t_user;

select date_part('epoch',createtime)::integer from t_user;

20

ON DUPLICATE KEY UPDATE

mysql的存在则更新写法,pg换成,

改成

INSERT INTO 表名(列1,列2...) VALUES ('值1','值2',...)ON CONFLICT(唯一或排除约束字段名) DO UPDATE SET 列1='值',列2='值',...;

如果是批量插入的话改成:

INSERT INTO 表名(列1,...)ON CONFLICT(唯一或排除约束字段名) DO UPDATE SET 列1=excluded.列1,列2=excluded.列2,...;

需要注意的是:

唯一或排除约束字段名必须是一个唯一索引或唯一联合索引,如果填写多个唯一索引则不生效,如果要生效的话,必须把他们建立成一个唯一联合索引。

insert into t_user(id,name,logintime,PASSWORD,createuser,updateuser) values(1,'test',now(),1,1) on duplicate key update logintime = values(logintime);

insert into t_user(id,"PASSWORD",1) ON CONFLICT(id) DO UPDATE SET logintime=excluded.logintime;

21

instr()

没有instr()函数,改成like。例:

SELECT * FROM user WHERE INSTR(username,'2')>0

SELECT * FROM user WHERE username like '%2%'

select * from t_user where INSTR(name,'a')>0

select * from t_user where name like '%a%'

22

` `

查询的字段 ` 号换成双引号,select \"name\" from ...

select `name` from t_user;

select "name" from t_user;

23

表名大小写

表名称中含有大写字母需要用双引号将表格名称包含起来

select PASSWORD from t_user;

select "PASSWORD" from t_user;

24

表名别名大小写

查询结果别名中有大写需要用双引号包含起来如果不包含起来查询结果会自动转为小写,select area_id as "areaId" from ...

-

-

25

GROUP BY

GROUP BY 分组查询不能查不在分组内的数据(也不能对非GROUP BY的字段进行ORDER BY排序),需要变成连表查询,链表查需要注意是否有重复数据。

例如:

SELECT cname,wmname,MAX(avg) FROM makerar GROUP BY cname ORDER BY wmname;(查询失败)

如果没有重复数据换成:

SELECT m.cname,m.wmname,t.mx

FROM (

SELECT cname,MAX(avg) AS mx

FROM makerar

GROUP BY cname

) t JOIN makerar m ON m.cname = t.cname AND t.mx = m.avg

ORDER BY m.wmname

;

如果有重复数据需要进行去重则换成:(利用窗口函数)

SELECT

cname,

DISTINCT ON(wmname)wmname wmname,

MAX(avg) OVER (PARTITION BY wmname) AS mx

FROM makerar

如果需要对不是去重的字段进行排序则在最外层加上排序:

SELECT * FROM (

SELECT

cname,

DISTINCT ON(wmname)wmname wmname,

MAX(avg) OVER (PARTITION BY wmname) AS mx

FROM makerar

) bb

ORDER BY m.wmname

select name,count(type) from t_company group by type order by type desc;

select aa.name,aa.count from (select distinct on(type)type "type",count(type) OVER (PARTITION BY type) from t_company) aa order by aa.type desc;

26

uuid()

uuid()函数不存在,安装扩展函数

create extension "uuid-ossp";

select uuid();

select uuid_generate_v4();

27

时间模糊查询

在进行时间模糊查询的时候需要转换一下时间,例如:

SELECT * FROM xxx WHERE to_char(create_time,'yyyy-MM-dd hh24:mi:ss') LIKE CONCAT(#{mouth},'%')

select realname,logintime from t_user where logintime like '%2023%'

select realname,logintime from t_user where to_char(logintime,'yyyy-MM-dd hh24:mi:ss') like '%2023%'

28

replace into

在业务先删除在插入。

如果可以的话可以用下面的写法,看业务需要

pg 没有这个语法,

如果根据以为能改成存在更新不存在就插入的话可以用以下写法:

INSERT INTO 表名(列1,...;

需要注意的是:

唯一或排除约束字段名必须是一个唯一索引或唯一联合索引,如果填写多个唯一索引则不生效,如果要生效的话,必须把他们建立成一个唯一联合索引。

-

-

29

like

如果对int字段进行like判断需要将字段转为VARCHAR类型,例如:

where state::VARCHAR like concat('%',#{state},'%') ...

select id from t_user where id like '%2023%'

select id from t_user where id::varchar like '%2023%'

30

时间/between and

如果判断between and是时间,

情况1、数据库是timestamp,and两边是字符串格式为'yyyy-MM-dd HH:mm:ss'则

where to_char(create_time,'yyyy-MM-dd hh24:mi:ss') between #{startTime} and #{endTime}

select * from t_user where logintime between '2023-01-01 00:00:00' and '2023-01-16 23:59:59'

select * from t_user where to_char(logintime,'yyyy-MM-dd hh24:mi:ss') between '2023-01-01 00:00:00' and '2023-01-16 23:59:59'

31

关键字

关键字:

name、value、label、moudle

需要双引号包含起来

-

-

32

运算符号 +

mysql 返回结果可直接通过+拼接字符串, pg不支持,改成concat方法

-

-

33

实体类

实体类里面@TableField里写的字段有大写或者 ` 号的要改成双引号,例如 @TableField("\"order\"")、@TableField("\"createTime\"")

-

-

34

curdate()

没有curdate()函数,换成,current_date。注意没有括号例如:select current_date;

select curdate();

select current_date;

35

inet_aton()、inet6_aton()

没有inet_aton()和inet6_aton()函数,使用inet()函数进行判断

select inet_aton('1.1.1.1')

select inet('1.1.1.1')

36

locate()

没有locate()函数,换成position()

select locate('b','ayyvkhlbm')

select position('b' in 'ayyvkhlbm')

37

ORDER BY

按照指定字段值排序

ORDER BY FIELD (`field`,value1,value2)

使用CASE WHEN END替代(eg:ORDER BY CASE field WHEN value1 THEN WHEN value2 THEN 2 END)

38

convert()

没有convert()函数,用convert_from()替换

convert(vendor using gbk)

convert_from(vendor::bytea,'gbk')

39

bool字段查询和插入,不可以使用0,1;修改PG数据库内置转换规则SQL语句:

update pg_cast set castcontext='i' where castsource ='integer'::regtype and casttarget='boolean'::regtype;
update pg_cast set castcontext='i' where castsource ='integer'::regtype and casttarget='boolean'::regtype;

-- eg: type为bool类型

insert into test_ly(id,type) VALUES(2,0);

select * from test_ly where type = 1;

-- eg: type为bool类型

insert into test_ly(id,0);

select * from test_ly where type = 1;

40

关联字段,条件查询字段类型不一致时,产生报错问题;强制转换,如转换为字符串 ::varchar,bigint ::BIGINT

::BIGINT

-

select u.id from t_user as u left join t_cascade_work_order w on u.id = w.author_id::BIGINT;

41

substring_index()

PG中无该函数,创建自定义函数,实现该功能

CREATE OR REPLACE FUNCTION substring_index(varchar,varchar,integer)
RETURNS varchar AS $$
DECLARE
tokens varchar[];
length integer ;
indexnum integer;
BEGIN
tokens := pg_catalog.string_to_array($1,$2);
length := pg_catalog.array_upper(tokens,1);
indexnum := length - ($3 * -1) + 1;
IF $3 >= 0 THEN
RETURN pg_catalog.array_to_string(tokens[1:$3],$2);
ELSE
RETURN pg_catalog.array_to_string(tokens[indexnum:length],$2);
END IF;
END;
$$ IMMUTABLE STRICT LANGUAGE PLPGSQL;

原文地址:https://blog.csdn.net/weixin_42303757/article/details/128896250

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


文章浏览阅读601次。Oracle的数据导入导出是一项基本的技能,但是对于懂数据库却不熟悉Oracle的同学可能会有一定的障碍。正好在最近的一个项目中碰到了这样一个任务,于是研究了一下Oracle的数据导入导出,在这里跟大家分享一下。......_oracle 迁移方法 对比
文章浏览阅读553次。开头还是介绍一下群,如果感兴趣polardb ,mongodb ,mysql ,postgresql ,redis 等有问题,有需求都可以加群群内有各大数据库行业大咖,CTO,可以解决你的问题。加群请联系 liuaustin3 ,在新加的朋友会分到2群(共700多人左右 1 + 2)。最近我们在使用MYSQL 8 的情况下(8.025)在数据库运行中出现一个问题 参数prefer_order_i..._mysql prefer_ordering_index
文章浏览阅读3.5k次,点赞3次,收藏7次。折腾了两个小时多才成功连上,在这分享一下我的经验,也仅仅是经验分享,有不足的地方欢迎大家在评论区补充交流。_navicat连接opengauss
文章浏览阅读2.7k次。JSON 代表 JavaScript Object Notation。它是一种开放标准格式,将数据组织成中详述的键/值对和数组。_postgresql json
文章浏览阅读2.9k次,点赞2次,收藏6次。navicat 连接postgresql 注:navicat老版本可能报错。1.在springboot中引入我们需要的依赖以及相应版本。用代码生成器生成代码后,即可进行增删改查(略)安装好postgresql 略。更改配置信息(注释中有)_mybatisplus postgresql
文章浏览阅读1.4k次。postgre进阶sql,包含分组排序、JSON解析、修改、删除、更新、强制踢出数据库所有使用用户、连表更新与删除、获取今年第一天、获取近12个月的年月、锁表处理、系统表使用(查询所有表和字段及注释、查询表占用空间)、指定数据库查找模式search_path、postgre备份及还原_pgsql分组取每组第一条
文章浏览阅读3.3k次。上一篇我们学习了日志清理,日志清理虽然解决了日志膨胀的问题,但就无法再恢复检查点之前的一致性状态。因此,我们还需要日志归档,pg的日志归档原理和Oracle类似,不过归档命令需要自己配置。以下代码在postmaster.c除了开启归档外,还需要保证wal_level不能是MINIMAL状态(因为该状态下有些操作不会记录日志)。在db启动时,会同时检查archive_mode和wal_level。以下代码也在postmaster.c(PostmasterMain函数)。......_postgresql archive_mode
文章浏览阅读3k次。系统:ubuntu22.04.3目的:利用向日葵实现windows远程控制ubuntu。_csdn局域网桌面控制ubuntu
文章浏览阅读1.6k次。表分区是解决一些因单表过大引用的性能问题的方式,比如某张表过大就会造成查询变慢,可能分区是一种解决方案。一般建议当单表大小超过内存就可以考虑表分区了。1,继承式分区,分为触发器(trigger)和规则(rule)两种方式触发器的方式1)创建表CREATE TABLE "public"."track_info_trigger_partition" ( "id" serial, "object_type" int2 NOT NULL DEFAULT 0, "object_name..._pg数据表分区的实现
文章浏览阅读3.3k次。物联网平台开源的有几个,就我晓得的有、、thingskit、JetLink、DG-iot(还有其他开源的,欢迎在评论区留言哦!),然后重点分析了下ThingsBoard、ThingsPanel和JetLink,ThingsBoard和Jetlinks是工程师思维产品,可以更多的通过配置去实现开发的目的,ThingsPanel是业务人员思路产品,或者开发或者用,避免了复杂的配置带来的较高学习门槛。ThingsBoard和Jetlinks是Java技术体系的,ThingsPanel是PHP开发的。_jetlinks和thingsboard
文章浏览阅读3.8k次。PostgreSQL 数据类型转换_pgsql数字转字符串
文章浏览阅读7k次,点赞3次,收藏14次。在做数据统计页面时,总会遇到统计某段时间内,每天、每月、每年的数据视图(柱状图、折线图等)。这些统计数据一眼看过去也简单呀,不就是按照时间周期(天、月、年)对统计数据进行分个组就完了嘛?但是会有一个问题,简单的写个sql对周期分组,获取到的统计数据是缺失的,即没有数据的那天,整条记录也都没有了。如下图需求:以当前月份(2023年2月)为起点,往后倒推一年,查询之前一年里每个月的统计数据。可见图中的数据其实是缺少的,这条sql只查询到了有数据的月份(23年的1月、2月,22年的12月)_如何用一条sql查出按年按月按天的汇总
文章浏览阅读3.8k次,点赞66次,收藏51次。PostgreSQL全球开发小组与2022年10月13日,宣布发布PostgreSQL15,这是世界上最先进的开源数据库的最新版本_mysql8 postgresql15
文章浏览阅读1.3k次。上文介绍了磁盘管理器中VFD的实现原理,本篇将从上层角度讲解磁盘管理器的工作细节。_smgrrelationdata
文章浏览阅读1.1k次。PostgreSQL设置中文语言界面和局域网访问_postgressql汉化
文章浏览阅读4.2k次。PostgreSQL 修改数据存储路径_如何设置postgresql 数据目录
文章浏览阅读4.7k次。在项目中用到了多数据源,在连接postgres数据库时,项目启动报错,说数据库连接错误,说dual不存在,网上好多教程都是说数据库查询的时候的大小写问题,而这个仅仅是连接,咋鞥却处理方法是修改application-dev.yml中的配置文件.项目中的druid参数是这样的:确实在配置文件中有个查询语句。_relation "dual" does not exist
文章浏览阅读4.9k次。PostgreSQL是一款强大的关系型数据库,但在实际使用过程中,许多用户经常会遇到慢SQL的问题。这些问题不仅会降低数据库性能,还会直接影响业务流程和用户体验。因此,本文将会深入分析PostgreSQL慢SQL的原因和优化方案,帮助用户更好地利用这个优秀的数据库系统。无论你是初学者还是专业开发者,本文都将为你提供实用的技巧和方法,让你的PostgreSQL数据库始终保持高效快速。_postgresql数据库优化
文章浏览阅读1.6k次。Linux配置postgresql开机自启_linux 启动pgsql
文章浏览阅读2k次。本篇介绍如何在centos7系统搭建一个postgresql主备集群实现最近的HA(高可用)架构。后续更高级的HA模式都是基于这个最基本的主备搭建。_postgresql主备