日积月累 水滴石穿

mysql及postgresql的自增长优缺点


2023-07-20 13:35:02

实现方式

  • mysql是通过在主键中加入auto_increment属性来实现自增长
  • pg则通过sequence来实现,类似于oracle。创建表时,主键有上serial关键字,则会自动创建一个序列.

mysql 优缺点

  • 优点是auto_increment基本不怎么用手工修改,有新的主键进来,自动会变成max(主键) + 1。
  • 缺点是无法在特殊情况化灵活使用,如:除个别几个主键值指定外,其它都顺序增长。就很难实现。

pg优缺点

  • 优点,够灵活,个别键值设置高一些值,其它不变,当出现重复主键时,当条插入失败,再键值+1,并可能插入成功。
  • 缺点一:当我调整表结构时,会采用先改名旧表,再重建新表,从旧表把数据倒入。这时,建新表时,会重建一个sequence,且初始为0。这时就需要手工alter sequence ssss restart with nnnn; 来修改实始值。一种实现方法是copy完数据后,执行从当前主键中取出最大值,设置sequence,类似以下sql。
    select setval(pg_get_serial_sequence('task.task_notify', 'tntf_id'), (select max(tntf_id) from task.task_notify));
  • 缺点二:当主键或唯一索引出理重复时,sql执行会报错,但此时sequence还是继续增加。很容易出现主键id不连贯的现象。当然,如果失败连sequence也rollback时,当出现重复主键时,就不会在下次相同操作中正常执行。