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

这篇具有很好参考价值的文章主要介绍了关于PostgreSql数据库和mysql的不同点及注意事项。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、数据类型:

1. update time (更新时间)

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

  1. 定义触发器
 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
  1. 创建触发器
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;
  1. 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 之外的所有常量值都必须用单引号引起来

True False
true false
‘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

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

二、Postgresql函数与mysql异同点:

1. if函数

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

2. Ifnull

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

3. 时间函数

  1. 没有datediff,使用 date_part
    date_part(‘epoch’, TIMESTAMP ‘2019-05-05 12:11:20’ - TIMESTAMP ‘2019-05-05 10:10:10’)
  2. 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 返回的是更新后的值,不能返回更新前的值。
例如:文章来源地址https://www.toymoban.com/news/detail-428395.html

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

三、数据库编码

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

到了这里,关于关于PostgreSql数据库和mysql的不同点及注意事项的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包赞助服务器费用

相关文章

  • Navicat 连接远程数据库 Postgresql、MySQL

    Navicat 连接远程数据库 Postgresql、MySQL

    不管什么数据库,只要用Navicat连接远程,下面的方法均奏效。 环境: 服务器:远程服务器 操作系统: : linux 数据库:PostgreSQL14 数据库客户端:Navicat 主要分为两步: 第一步:点击Navicat左上角的“连接”,选择Postgresql。先连接SSH服务器。  勾选“使用SSH通道”,在下面输

    2024年02月05日
    浏览(10)
  • 谈一谈SQLite、MySQL、PostgreSQL三大数据库

    谈一谈SQLite、MySQL、PostgreSQL三大数据库

    每一份付出,必将有一份收货,就像这个小小的果实,时间到了,也就会开花结果… SQLite、MySQL 和 PostgreSQL 都是流行的关系型数据库管理系统(RDBMS),但它们在功能、适用场景和性能方面有一些不同。 SQLite : 轻量级 : SQLite 是一个嵌入式数据库,它不需要一个独立的数据库

    2024年02月05日
    浏览(13)
  • 利用pgloader工具将MySQL数据迁移至PostgreSQL数据库

    利用pgloader工具将MySQL数据迁移至PostgreSQL数据库

    一、简介 pgloader是一款开源软件,可以将各种来源的数据加载到PostgreSQL数据库中,支持动态读取数据,使用 COPY 流式传输协议将数据加载到 PostgreSQL 数据库中,并使用单独的线程读取和写入数据,由于能够直接从源数据库加载数据。今天我们就借助pgloader这款工具实现将MySQL数

    2024年02月13日
    浏览(15)
  • [运维|数据库] PostgreSQL数据库对MySQL的 READS SQL DATA 修饰符处理

    在 PostgreSQL 中,访问权限通常是通过数据库角色和表级别的权限进行管理,而不需要类似 MySQL 中的 READS SQL DATA 修饰符。 要在 PostgreSQL 中管理数据库对象的访问权限,您可以使用以下 SQL 命令: GRANT :授予用户或角色对表、视图等对象的特定权限。 REVOKE :撤销用户或角色对

    2024年02月07日
    浏览(13)
  • Mysql不同数据库之间表结构同步

    Mysql不同数据库之间表结构同步

    开发环境的Mysql表结构做了修改,要同步到其他环境数据库中使用数据库管理工具JookDB的表结构同步功能就很方便。虽然Navicat也有这个功能但是有免费的当然是用免费的。 用JookDB添加数据库后在数据库节点上右键选择“同步结构”即可开始表结构同步。 1.选择结构同步的源库

    2024年02月05日
    浏览(12)
  • POSTGRESQL 关于2023-08-14 数据库自动启动文章中使用KILL 来进行配置RELOAD的问题解释...

    POSTGRESQL 关于2023-08-14 数据库自动启动文章中使用KILL 来进行配置RELOAD的问题解释...

    开头还是介绍一下群,如果感兴趣Polardb ,mongodb ,MySQL ,Postgresql ,redis ,SQL SERVER ,ORACLE,Oceanbase 等有问题,有需求都可以加群群内有各大数据库行业大咖,CTO,可以解决你的问题。加群请加 liuaustin3微信号 ,在新加的朋友会分到3群(共1170人左右 1 + 2 + 3) 首先道歉,昨天关于P

    2024年02月12日
    浏览(14)
  • Debezium系列之:基于debezium将mysql数据库数据更改流式传输到 Elasticsearch和PostgreSQL数据库

    Debezium系列之:基于debezium将mysql数据库数据更改流式传输到 Elasticsearch和PostgreSQL数据库

    基于 Debezium 的端到端数据流用例,将数据流式传输到 Elasticsearch 服务器,以利用其出色的功能对我们的数据进行全文搜索。 同时把数据流式传输到 PostgreSQL 数据库,通过 SQL 查询语言来优化对数据的访问。 下面的图表显示了数据如何流经我们的分布式系统。首先,Debezium M

    2024年02月13日
    浏览(10)
  • SQLite、MySQL、PostgreSQL3个关系数据库之间的对比

    SQLite、MySQL、PostgreSQL3个关系数据库之间的对比

    关系数据模型 以行和列的表格形式组织数据,在数据库管理工具中占主导地位。今天还有其他数据模型,包括NoSQL和NewSQL,但是关系数据库管理系统(RDBMS)仍然占主导地位用于存储和管理全球数据。 本文比较了三种实现最广泛的开源RDBMS:SQLite、MySQL和PostgreSQL。具体来说,

    2024年02月11日
    浏览(10)
  • [AIGC] MySQL与PostgreSQL:两种流行的数据库系统的对比

    [AIGC] MySQL与PostgreSQL:两种流行的数据库系统的对比

    数据库是存储和查询数据的重要工具。在选择数据库时,两个经常被考虑的选项都是开源的:MySQL和PostgreSQL。这两个数据库都与许多应用程序一起使用,但它们在某些方面存在显著的不同。在本文中,我们将比较MySQL和PostgreSQL的一些关键特性。 MySQL是一种关系数据库管理系统

    2024年04月12日
    浏览(14)
  • 快速实现数据库的转换,如从Mysql切换到Postgresql【含gif】

    快速实现数据库的转换,如从Mysql切换到Postgresql【含gif】

    因为项目的需要,需要将使用的数据库A从Mysql切换到Postgresql并且合并到同一个数据库B中。 使用 Navicat 15的【逆向表到模型】功能,可以快速将Mysql表转为Postgresql表(数据+表结构),而且支持多表的转换。 * 注意到一个小细节: Navicat 15【多表选择】时不能在左侧[导航栏]直接

    2024年02月11日
    浏览(9)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包