1、MySQL迁移到Postgres

之前用mysql习惯了,所以建表都是有自增主键的,建表规范里面大部分都是这样约定的,比如:(`id` BIGINT (11) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '主键id'),那么到了postgres里面,发现么有这样的类似定义,postgres是和oracle相近的体系,所以得换种方式来实现。oracle里面有序列,posgres里面也有,我们可以通过序列来实现自增主键的功能。

2、实现过程

2.1 创建普通表

create table test_c (id integer PRIMARY KEY comment 'primary key',nick_name character varying(128) comment 'nick name'
);  

2.2 创建序列

CREATE SEQUENCE "public"."csdn_id_20200928_seq"INCREMENT 1START 1MINVALUE 1MAXVALUE 99999999  -- no maxvalue,没有最大值CACHE 1;

2.3 将序列值赋予给主键字段

alter table public.test_c alter column id set default nextval('csdn_id_20200928_seq');

【备注】,drop表test_c的时候,这个序列不会被drop掉,还可以继续使用。

3、序列Sequence的维护

3.1 修改自增序列

 -- 删除前先解除 id 对该序列的依赖ALTER TABLE tablename ALTER COLUMN id SET DEFAULT null;DROP SEQUENCE IF EXISTS sequence_name;-- 设置起始值,id_max 即 id 目前的最大值,可写为1,可通过 “SELECT MAX(id) FROM tablename” 得到CREATE SEQUENCE sequence_name START WITH id_max;ALTER TABLE tablename ALTER COLUMN id SET DEFAULT nextval('sequence_name'::regclass);-- 获得序列值csdn_gis=> select max(id) from public.csdn_20200928;]  max  -------43739(1 row)csdn_gis=> ]-- 设置起始值alter sequence csdn_id_20200928_seq restart with 50000-- 验证SELECT nextval('sequence_name');

3.2 设置字段默认值

 -- 设置postgres自增表的日期字段默认值ALTER TABLE test_c ALTER COLUMN g_created  SET DEFAULT CURRENT_TIMESTAMP(3);ALTER TABLE test_c ALTER COLUMN g_modified   SET DEFAULT CURRENT_TIMESTAMP(3);-- 删除pgsql自增表的默认值ALTER TABLE test_c ALTER COLUMN nick_name DROP DEFAULT;

4、序列的函数

附赠序列的一些自带函数:

函数 返回类型 描述
nextval(regclass) bigint 递增序列对象到它的下一个数值并且返回该值。这个动作是自动完成的。即使多个会话并发运行nextval,每个进程也会安全地收到一个唯一的序列值。
currval(regclass) bigint 在当前会话中返回最近一次nextval抓到的该序列的数值。(如果在本会话中从未在该序列上调用过 nextval,那么会报告一个错误。)请注意因为此函数返回一个会话范围的数值,而且也能给出一个可预计的结果,因此可以用于判断其它会话是否执行过nextval。
lastval() bigint 在当前会话中返回最近一次nextval抓到的该序列的数值。(如果在本会话中从未在该序列上调用过 nextval,那么会报告一个错误。)请注意因为此函数返回一
返回当前会话里最近一次nextval返回的数值。这个函数等效于currval,只是它不用序列名为参数,它抓取当前会话里面最近一次nextval使用的序列。如果当前会话还没有调用过nextval,那么调用lastval将会报错。 
setval(regclass, bigint) bigint 重置序列对象的计数器数值。设置序列的last_value字段为指定数值并且将其is_called字段设置为true,表示下一次nextval将在返回数值之前递增该序列。
setval(regclass, bigint, boolean) bigint 重置序列对象的计数器数值。功能等同于上面的setval函数,只是is_called可以设置为true或false。如果将其设置为false,那么下一次nextval将返回该数值,随后的nextval才开始递增该序列。

5、PostgreSQL主要优势

整理下PostgresSQL的一些优势(不一定完全正确仅供参考)

  • PostgreSQL完全免费,而且是BSD协议,如果你把PostgreSQL改一改,然后再拿去卖钱,也没有人管你,这一点很重要,这表明了PostgreSQL数据库不会被其它公司控制。oracle数据库不用说了,是商业数据库,不开放。而MySQL数据库虽然是开源的,但现在随着SUN被oracle公司收购,现在基本上被oracle公司控制,其实在SUN被收购之前,MySQL中最重要的InnoDB引擎也是被oracle公司控制的,而在MySQL中很多重要的数据都是放在InnoDB引擎中的,反正我们公司都是这样的。所以如果MySQL的市场范围与oracle数据库的市场范围冲突时,oracle公司必定会牺牲MySQL,这是毫无疑问的。

  • 与PostgreSQl配合的开源软件很多,有很多分布式集群软件,如pgpool、pgcluster、slony、plploxy等等,很容易做读写分离、负载均衡、数据水平拆分等方案,而这在MySQL下则比较困难。

  • PostgreSQL源代码写的很清晰,易读性比MySQL强太多了,怀疑MySQL的源代码被混淆过。所以很多公司都是基本PostgreSQL做二次开发的。

  • PostgreSQL在很多方面都比MySQL强,如复杂SQL的执行、存储过程、触发器、索引。同时PostgreSQL是多进程的,而MySQL是线程的,虽然并发不高时,MySQL处理速度快,但当并发高的时候,对于现在多核的单台机器上,MySQL的总体处理性能不如PostgreSQL,原因是MySQL的线程无法充分利用CPU的能力。

学习笔记 - Postgres如何创建有自增主键的表相关推荐

  1. MYSQL学习笔记06:列属性[NULL,default,comment],主键,自增长,唯一键,数据库设计规范[范式(1NF,2NF,3NF),逆规范化],表关系[1V1,1VN,NVN]

    列属性 列属性又称为字段属性. 在mysql中一共有6个属性:null,默认值,列描述,主键,唯一键和自增长. NULL属性 NULL属性代表字段为空. 如果对应的值为yes表示该字段允许为null, ...

  2. mysql 自增 不是主键_程序员经典面试题,MySQL自增主键为什么不连续

    在我们日常使用Mysql中,如果不是特殊的业务需要,一般我们都会使用自增主键,自增主键的好处可以在插入的时候尽量地减少页分割,增加Mysql的写入效率.我们有时候就会发现,自增主键并不是连续递增的,为 ...

  3. 主键冲突报什么代码_程序员经典面试题,Mysql自增主键为什么不连续

    在我们日常使用Mysql中,如果不是特殊的业务需要,一般我们都会使用自增主键,自增主键的好处可以在插入的时候尽量地减少页分割,增加Mysql的写入效率.我们有时候就会发现,自增主键并不是连续递增的,为 ...

  4. sqlserver新增主键自增_SQLSERVER自增主键

    SQLSERVER自增主键 SQLServer 中含自增主键的表,通常不能直接指定ID值插入,可以采用以下方法插入. 1. SQLServer 自增主键创建语法: identity(seed, inc ...

  5. Mysql 自增主键设置以及重置自增值

    一.自增主键设置 CREATE TABLE `table_name` (`IncreaseId` INT(16) NOT NULL AUTO_INCREMENT COMMENT '自增主键',`Ins ...

  6. INNODB自增主键的一些问题 vs mysql获得自增字段下一个值

    今天发现 批量插入下,自增主键不连续了....... InnoDB AUTO_INCREMENT Lock Modes This section describes the behavior of A ...

  7. 【Mybatis】学习笔记01:连接数据库,实现增删改

    需要数据库SQL的请跳转到文末 哔哩哔哩 萌狼蓝天[转载资料][尚硅谷][MyBatis]2022版Mybatis配套MD文档[Mybatis]学习笔记01:连接数据库,实现增删改[Mybatis]学 ...

  8. 【opencv学习笔记八】创建TrackBar轨迹条

    createTrackbar这个函数我们以后会经常用到,它创建一个可以调整数值的轨迹条,并将轨迹条附加到指定的窗口上,使用起来很方便.首先大家要记住,它往往会和一个回调函数配合起来使用.先看下他的函数 ...

  9. Linux学习笔记---使用BusyBox创建根文件系统(四)

    目录 软件运行测试 设置程序为后台运行 设置开机自启动 外网连接测试 软件运行测试 进入到rootfs文件夹中新建一个drivers文件夹,用于存放编写的软件. 新建hello.c文件 输入以下代码 ...

最新文章

  1. linux终端程序如何编写,[LINUX]利用Ncursesw编写支持中文的终端程序
  2. JSP第四课:用户注册登录设计(内置对象使用)
  3. 了解mysqlpump工具
  4. 轻量级锁的加锁和解锁逻辑-自旋锁
  5. linux性能优化--cpu篇
  6. 百练2815:城堡问题(DFS)
  7. angular自带的一些api_Angular API
  8. Python版C语言词法分析器
  9. jedis操作set_使用 JedisAPI 操作 Redis
  10. 使用所学的javaWeb知识,实现一个小型的记账管理系统
  11. SDUT OJ温度转换
  12. 【预测师】的时间管理方法论(泰山版)
  13. BIOS与UEFI以及模拟环境
  14. npm包--rimraf
  15. 转载于 Bob Lyle 谈 DB2 中的 OLAP 函数
  16. 基于粒子群优化算法的最小二乘支持向量机预测模型构建(MATLAB实现)
  17. 程序员,请从25岁开始打造个人品牌
  18. 数据库无法修改问题解决
  19. OpenSSL中文手册之密码学理论基础(未完待续)
  20. 软件设计师笔记之网络基础知识

热门文章

  1. 怎么退出自适应巡航_减少系统干扰 体验ACC自适应巡航
  2. nikebot nike机器人 如何做一个nikebot nike监控怎么能不延迟 nike如何过盾 bot 机器人 snkrs
  3. Telegram 搜索机器人BOT
  4. 抢鞋软件bot服务器系统,抢鞋子bot机器人有用吗 抢鞋子用什么APP
  5. Vue调用本地摄像头权限
  6. 探针台选型的有哪些注意事项
  7. 实数系的基本定理_什么是实数(1):Dedekind分割
  8. 卷积法求解系统的零状态响应_利用卷积可以求解系统的零状态响应..ppt
  9. 计算机三级网络技术(重点)
  10. pytdx 获取板块指数_通达信如何查看行业板块和概念板块的指数和K线图