关于PostgreSql数据库与mysql数据库的不同点以及注意事项

 更新时间:2023年05月27日 14:58:15   作者:白衣无暇  
PostgreSQL和MySQL是两种流行的关系型数据库管理系统(RDBMS),它们都可以用来存储和管理数据,但是它们在某些方面有所不同,下面这篇文章主要给大家介绍了关于PostgreSql数据库与mysql数据库的不同点以及注意事项的相关资料,需要的朋友可以参考下

一、数据类型:

1. update time (更新时间)

更新时间戳需要通过触发器来实现。

定义触发器

 CREATE OR REPLACE FUNCTION "public"."cs_timestamp"()
  RETURNS "pg_catalog"."trigger" AS $BODY$
begin
    new.updated_time= current_timestamp;
    return new;
end
$BODY$
  LANGUAGE plpgsql VOLATILE
  COST 100

创建触发器

create trigger cs_time before update on table1 for each row execute procedure cs_timestamp();

2. IN

dapper 判断了connection 是否是npgsql ,如果是,表示支持 数组类型,不展开数组。也就是 in @ids ,在npgsql下不做转化为 in (@p1,@p2…),故 在pgsql 下要用 any(@ids)

例如:

select * from tbl where id = any(@ids);

3. upsert

upsert是一个组合词,即当往表中插入记录,如果该记录已存在则更新,否则插入新记录。为了使用该特性需要使用

INSERT ON CONFLICT:
INSERT INTO table_name(column_list)
VALUES(value_list)
ON CONFLICT target action;

target 可以是:

(column_name):一个字段名

ON CONSTRAINT constraint_name:其中的 constraint_name 可以是一个唯一约束的名字

WHERE predicate: WHERE 子句

action为下面两者之一:

1.DO NOTHING 表示如果数据相同则不做任何操作。例如

INSERT INTO customers (name, email)
VALUES('Microsoft','hotline@microsoft.com')
ON CONFLICT (name)
DO NOTHING;

2.DO UPDATE 则表示如果存在以 name为唯一索引的重复数据,则做更新操作。

例如:

INSERT INTO customers (name, email)
VALUES('Microsoft','hotline@microsoft.com')
ON CONFLICT (name)
DO
UPDATE SET email = EXCLUDED.email || ';' || customers.email;

其中EXCLUDED为虚拟表,EXCLUDED中包含我们药更新的记录,也就是新记录,而customers为原纪录。

4. Boolean

boolean 有"true"或"false"两个状态,第三种"unknown"(未知)状态,用 NULL 表示;

PostgreSQL支持TRUE和FALSE的以下有效文字值。除了 True 和 False 之外的所有常量值都必须用单引号引起来

TrueFalse
truefalse
‘t’'F ’
‘true’‘false’
‘yes’‘no’
‘1’‘0’

例如:

INSERT INTO table (id,status )
VALUES
	(101, TRUE),
	(201, FALSE),
	(301, 't'),
	(401, '1'),
	(501, 'y'),
	(601, 'yes'),
	(701, 'no'),
	(801, '0');

5. datetime

PostgreSql中没有datetime类型,主要有:TIME、DATE、TIMESTAMP、INTERVAL。日期时间类型输入像字符串类型输入一样,需要加单引号。每种日期时间类型都有合法的取值范围,超出范围时系统会将“零”插入数据记录中。

TIMESTAMP数据类型分为 两种时间数据类型,如下:

Timestamp: : 使用时间戳数据类型 ,不带时区。

Timestamptz: : timestamptz数据类型用于带有时区的 。

6. decimal 精确型:

  • 精确型:decimal、numeric
  • 不精确型:real、double precision(float等价于double precision)

二、Postgresql函数与mysql异同点:

1. if函数

不支持if函数,可改为case when语句;

2. Ifnull

改为COALESCE()

例如:COALESCE(a.result, '')

3. 时间函数

  • 没有datediff,使用 date_part
    date_part(‘epoch’, TIMESTAMP ‘2019-05-05 12:11:20’ - TIMESTAMP ‘2019-05-05 10:10:10’)
  • date_add替换 now() + interval ‘2 year’;

4. dml schema不一样

5. group by 聚合函数和mysql不同

postgresql输出中的所有字段(包含聚合函数的计算字段除外)必须存在于GROUP BY子句中。

6. update join 语法不一致

UPDATE t1
SET t1.c1 = new_value
FROM t2
WHERE t1.c2 = t2.c2;

7. delete join语法不一致

PostgreSQL不支持 Delete join语句,但支持delete中using 子句提供类似功能,

DELETE FROM t1
USING t2
WHERE t1.id = t2.id

使用using指定删除t1 中在 t2中的数据

8. 模糊匹配

like 改为 ilike

 ilike '%'|| #{testItem} ||'%'  或  like concat('%', #{testItem}, '%')

9. 支持retuning子句

insert returning 返回的是新插入的值。

delete returning 返回的是被删除的值。

update returning 返回的是更新后的值,不能返回更新前的值。

例如:

UPDATE customers SET email = '123' where name='Microsoft' RETURNING email

三、数据库编码

  • sql 中表名和字段名不要用双引号!
  • 所有schema(数据库名,模式名,表名,字段名,字段类型等)定义必须小写
  • 字段前面不能用波浪线 ‘~ ’
  • postgresql模式,一版用public,缺省用public。

总结

到此这篇关于PostgreSql数据库与mysql数据库的不同点以及注意事项的文章就介绍到这了,更多相关PostgreSql与mysql的不同点内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • PostgreSQL常用字符串分割函数整理汇总

    PostgreSQL常用字符串分割函数整理汇总

    作为当前最强大的开源数据库,Postgresql(以下简称pg)对字符的处理也是最为强大的,下面这篇文章主要给大家介绍了关于PostgreSQL常用字符串分割函数的相关资料,文中通过示例代码介绍的非常详细,需要的朋友可以参考下
    2022-07-07
  • 详解PostgreSQL提升批量数据导入性能的n种方法

    详解PostgreSQL提升批量数据导入性能的n种方法

    这篇文章主要介绍了PostgreSQL提升批量数据导入性能的n种方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-03-03
  • Postgresql数据库角色创建登录详解

    Postgresql数据库角色创建登录详解

    这篇文章主要为大家介绍了Postgresql数据库角色创建登录详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-02-02
  • postgresql insert into select无法使用并行查询的解决

    postgresql insert into select无法使用并行查询的解决

    这篇文章主要介绍了postgresql insert into select无法使用并行查询的解决,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-01-01
  • 详解PostgreSQL 14.4安装使用及一些安装的异常问题

    详解PostgreSQL 14.4安装使用及一些安装的异常问题

    这篇文章主要介绍了PostgreSQL 14.4的安装以及使用以及一些安装的异常,本文通过图文并茂的形式给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-07-07
  • PostgreSQL的B-tree索引用法详解

    PostgreSQL的B-tree索引用法详解

    这篇文章主要介绍了PostgreSQL的B-tree索引用法详解,有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-01-01
  • PostgreSQL归档配置及自动清理归档日志的操作

    PostgreSQL归档配置及自动清理归档日志的操作

    这篇文章主要介绍了PostgreSQL归档配置及自动清理归档日志的操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-01-01
  • Postgresql在mybatis中报错:操作符不存在:character varying == unknown的问题

    Postgresql在mybatis中报错:操作符不存在:character varying == unknown的问题

    这篇文章主要介绍了Postgresql在mybatis中报错: 操作符不存在 character varying == unknown的问题,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-01-01
  • PostgreSQL入门简介

    PostgreSQL入门简介

    PostgreSQL是一个免费的对象-关系型数据库服务器(ORDBMS),遵循灵活的开源协议BSD。这篇文章主要介绍了PostgreSQL入门简介,需要的朋友可以参考下
    2020-12-12
  • postgresql 切换 log、xlog日志的实现

    postgresql 切换 log、xlog日志的实现

    这篇文章主要介绍了postgresql 切换 log、xlog日志的实现方式,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-01-01

最新评论