PostgreSQL 主键自增解决方案

             

因为工作需要,接触到了PostgreSQL,遇到了主键自增的情况

引用一下PostgreSQL文档的原文:https://www.postgresql.org/docs/8.3/static/datatyp...

8.1.4. Serial Types

数据类型serialbigserial不是真正的类型,而只是用于设置唯一标识符列的符号方便(类似于 某些其他数据库支持的AUTO_INCREMENT属性)。在当前实现中,指定:

CREATE TABLE tablename(
     colname SERIAL
);

相当于指定:

CREATE SEQUENCE tablename_colname_seq;
CREATE TABLE tablename (
    colname integer NOT NULL DEFAULT nextval('tablename_colname_seq')
);
ALTER SEQUENCE tablename_colname_seq OWNED BY tablename.colname;

1、新创建表的时候可以指定为 serial 类型,自动将创建序列

2、修改已经存在的表,则可以

CREATE SEQUENCE table_serial_name
START WITH 1
INCREMENT BY 1
NO MINVALUE
NO MAXVALUE
CACHE 1;
alter table 'you_table_name' alter column 'you_column' set default nextval('table_serial_name');
# 开始值为1,增量为1,没有最小值,没有最大值


另外用到的几个和MySQL不同的地方

1、查询所有序列

select relname from pg_class where relowner=(select usesysid from pg_user where usename='postgres') and relkind='S';  #此处的 postgres 是用户名

可以参考 pg_class 表的文档 https://www.postgresql.org/docs/10/static/catalog-pg-class.html

2、查询主键

SELECT pg_constraint.conname, pg_attribute.attname
FROM pg_constraint
INNER JOIN pg_class ON pg_constraint.conrelid = pg_class.oid
INNER JOIN pg_attribute ON pg_attribute.attrelid = pg_class.oid AND pg_attribute.attnum = pg_constraint.conkey [ 1 ]
WHERE pg_class.relname = 'you_table_name' AND pg_constraint.contype = 'p'

pg_constraint 表的文档 https://www.postgresql.org/docs/10/static/catalog-pg-constraint.html

pg_class 表的文档 https://www.postgresql.org/docs/10/static/catalog-pg-class.html

pg_attribute 表的文档 https://www.postgresql.org/docs/10/static/catalog-pg-attribute.html



发表评论 请登录再评论
  •   文章分类
回到顶部