SQL语句Mysql向postgresql迁移笔记

文章介绍了将MySQL的SQL语句迁移到PostgreSQL时需要注意的几个关键点,包括处理char类型后的空格,替换MySQL特有的反引号,确保关键字和标识符正确引用,转换时间函数,以及连表更新和排序删除的语法差异。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

SQL语句Mysql向postgresql迁移笔记

最近改用国产数据库,mysql下的sql语句在在postgresql上执行报错,初步修改。

char类型查出来后面有空格

程序删除,或者修改为varchar类型

双引号的使用

mysql特有符号“`”需要改为双引号

mysql特有符号【`】,需要替换为【"】双引号

SELECT `id`,`name`,`user`,`pwd` from `users`;

需要修改为

SELECT "id","name","user","pwd" from "users";

postgresql关键字必须加双引号

SELECT id,name,user,pwd from users;

需要修改为

SELECT id,name,"user",pwd from users;

数据库名称,表名,列名等如果有大写字符,必须双引号

SELECT “ID”,“Name”,“User”,“Pwd” from “Users”;

连表更新语句

mysql语法

UPDATE `custom`,`channels`
SET `custom`.`status` = `channels`.`Status`
WHERE `custom`.`id` = `channels`.`id`;

postgresql语法

UPDATE "custom"
SET "custom"."status" = "channels"."Status"
FROM   "channels"
WHERE "custom"."id" = "channels"."id";

时间函数

UNIX_TIMESTAMP 时间转时间戳

UNIX_TIMESTAMP(`start`) =>  TRUNC(EXTRACT(EPOCH FROM "start"))

FROM_UNIXTIME 时间戳转时间

FROM_UNIXTIME(时间戳) => TO_TIMESTAMP(时间戳)

DATA_ADD 时间戳加减

DATA_ADD(now() INTERVAL 180 SECOND) => now() + interval '180 S'
DATA_SUB(now() INTERVAL 180 SECOND) => now() - interval '180 S'

排序删除

mysql语法

DELETE FROM `gb_alarms` WHERE `created_at` < DATE_SUB(CURDATE(),INTERVAL 90 DAY) ORDER BY `created_at` ASC LIMIT 1000;

postgresql语法

DELETE FROM "gb_alarms" WHERE "id" IN ( SELECT "id" FROM "gb_alarms" WHERE created_at < now( ) - INTERVAL '90 D' ORDER BY created_at ASC LIMIT 1000 );

VARCHAR 不允许默认空字符串,需要需要非空索引。

不知道为什么,无法配置postgresql的列默认值为空字符串,只能修改表结构,但是基本不影响。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值