`
Tian.Wang
  • 浏览: 72592 次
  • 性别: Icon_minigender_2
  • 来自: 北京
社区版块
存档分类
最新评论

Postgresql 创建主键并设置自动递增的三种方法

阅读更多
    Postgresql 有以下三种方法设置主键递增的方式,下面来看下相同点和不同点。

--方法一
create table test_a
(
  id serial,
  name character varying(128),
  constraint pk_test_a_id primary key( id)
);

NOTICE:  CREATE TABLE will create implicit sequence "test_a_id_seq" for serial column "test_a.id"
NOTICE:  CREATE TABLE / PRIMARY KEY will create implicit index "pk_test_a_id" for table "test_a"
CREATE TABLE


--方法二
create table test_b
(
  id serial PRIMARY KEY,
  name character varying(128)
);

NOTICE:  CREATE TABLE will create implicit sequence "test_b_id_seq" for serial column "test_b.id"
NOTICE:  CREATE TABLE / PRIMARY KEY will create implicit index "test_b_pkey" for table "test_b"
CREATE TABLE


--方法三
create table test_c
(
  id integer PRIMARY KEY,
  name character varying(128)
); 
NOTICE:  CREATE TABLE / PRIMARY KEY will create implicit index "test_c_pkey" for table "test_c"
CREATE TABLE

//方法三上面的一小段是工具生成的,如果表已经建好,只要用下面的语句即可生成自动增长序列

CREATE SEQUENCE test_c_id_seq
    START WITH 1
    INCREMENT BY 1
    NO MINVALUE
    NO MAXVALUE
    CACHE 1;
   
alter table test_c alter column id set default nextval('test_c_id_seq');


     很明显从上面可以看出,方法一和方法二只是写法不同,实质上主键都通过使用 serial 类型来实现的,
使用serial类型,PG会自动创建一个序列给主键用,当插入表数据时如果不指定ID,则ID会默认使用序列的
NEXT值。   
   
    方法三是先创建一张表,再创建一个序列,然后将表主键ID的默认值设置成这个序列的NEXT值。这种写法
似乎更符合人们的思维习惯,也便于管理,如果系统遇到sequence 性能问题时,便于调整 sequence 属性;

--比较三个表的表结构
skytf=> \d test_a
                                 Table "skytf.test_a"
Column |          Type          |                      Modifiers                     
--------+------------------------+-----------------------------------------------------
id     | integer                | not null default nextval('test_a_id_seq'::regclass)
name   | character varying(128) |
Indexes:
    "pk_test_a_id" PRIMARY KEY, btree (id)
   
   
skytf=> \d test_b
                                 Table "skytf.test_b"
Column |          Type          |                      Modifiers                     
--------+------------------------+-----------------------------------------------------
id     | integer                | not null default nextval('test_b_id_seq'::regclass)
name   | character varying(128) |
Indexes:
    "test_b_pkey" PRIMARY KEY, btree (id)
       
   
skytf=> \d test_c
                                 Table "skytf.test_c"
Column |          Type          |                      Modifiers                     
--------+------------------------+-----------------------------------------------------
id     | integer                | not null default nextval('test_c_id_seq'::regclass)
name   | character varying(128) |
Indexes:
    "test_c_pkey" PRIMARY KEY, btree (id)
   
     从上面可以看出,三个表表结构一模一样, 三种方法如果要寻找差别,可能仅有以下一点,
当 drop 表时,方法一和方法二会自动地将序列也 drop 掉, 而方法三不会。

原文:http://francs3.blog.163.com/blog/static/40576727201111715035318/
分享到:
评论

相关推荐

    持久化类主键生成策略+例子

    本篇文章将深入探讨JPA的4种主键生成策略以及Hibernate的13种主键生成策略,并通过实例来帮助理解。 ### JPA主键生成策略 1. **`GenerationType.AUTO`**:这是最常用的策略,具体的生成方式由数据库供应商决定,...

    sql主键产生器

    2. **自动增长(Auto Increment)/标识列(Identity Column)**:在MySQL、SQL Server和PostgreSQL等数据库中,可以设置某列为主键并指定其为自动增长。每当插入新行时,数据库会自动为该列提供一个新的唯一值。 3....

    Hibernate中主键生成策略

    在Java的持久化框架Hibernate中,主键生成策略是一个至关重要的概念,它决定了数据库表中主键值如何自动生成。主键通常是表中唯一标识记录的一列,对于数据的完整性和一致性至关重要。以下是对Hibernate中主键生成...

    PostgreSQL从菜鸟到专家

    - **插入数据到serial类型的列中**:自动递增的字段。 - **插入空值**:如何正确插入NULL值。 - **使用\copy命令**:批量导入数据。 - **直接从另一个程序加载数据**:使用外部工具导入数据。 ##### 修改数据库中的...

    hibernate主键生成策略

    【hibernate主键生成策略】是Hibernate框架中用于生成持久化对象主键的重要机制,它决定了如何在数据库中创建唯一的标识符。在SSH(Spring、Struts、Hibernate)架构中,Hibernate作为持久层框架,主键生成策略的...

    Hibernate各种主键生成策略与配置详解

    Hibernate不参与主键的生成过程,这意味着你需要在调用save()之前通过setter方法为对象设置一个唯一的ID。这种方法虽然灵活,但可能导致并发问题,因此不推荐在多线程或分布式环境中使用。 配置示例: ```xml `...

    hibernate的主键生成策略

    这种策略要求用户在调用`save()`方法之前手动设置主键值。Hibernate不参与主键的生成,这意味着主键生成完全由应用控制,可以与数据库无关。这种方式虽然灵活,但可能导致主键冲突,因此不推荐使用。 2. **...

    可以方便设置sql自动编号

    在SQL(Structured Query Language)中,自动编号是一种常见的数据库设计特性,主要用于为表格中的记录创建唯一的标识符。这种特性在数据库管理系统(如MySQL、SQL Server、Oracle、PostgreSQL等)中通常被称为序列...

    Hibernate主键生成方式

    - **应用场景**:当不确定具体使用哪种主键生成策略时,可以采用 native,让 Hibernate 自动选择最合适的策略。 ##### 8. uuid.hex - **定义**:由 Hibernate 基于 128 位唯一值产生算法生成 16 进制数值(编码后...

    mybatis获取自增主键的值

    在数据库设计中,自增主键是一种常见的策略,它用于为表中的每一行生成一个唯一的标识符。在MyBatis这个流行的Java持久层框架中,处理自增主键的值通常涉及到插入数据后如何获取新生成的ID。下面将详细阐述MyBatis...

    Oracle、DB2、PostgreSQL之Sequence总结

    在Oracle、DB2和PostgreSQL这三种数据库管理系统中,Sequence都是内置的特性,允许用户创建并管理这样的自动递增序列。然而,值得注意的是,并非所有数据库系统都支持Sequence,比如MySQL、SQL Server和Sybase就没有...

    2.3-PostgreSQL数据库关系操作实践.ppt

    代理键(Surrogate Key)是一种额外的主键,通常用自动递增的数字来标识记录,如`CoursePlanID`和`CourseRegID`,这可以避免主键因业务规则变化而更改。 6. **定义实体完整性** 实体完整性通过设置主键约束来实现...

    Laravel开发-has-uuid

    3. 数据库迁移:在创建表的迁移文件中,设置主键为UUID类型,如在MySQL中使用`binary(16)`或`char(36)`,在PostgreSQL中使用`uuid`。 ```php public function up() { Schema::create('my_models', function ...

    Hibernate的主键生成方式

    在Hibernate框架中,提供了多种主键生成策略,每种策略都有其适用场景。本文将详细介绍这些生成策略,并给出相应的应用场景分析。 #### 二、主键生成策略 1. **assigned** - **定义**:这种方式由程序员负责分配...

    Hibernate主键类型说明和配置手册.doc

    10. **assigned**: 主键值由应用程序自己设定,需在调用`save()`方法前完成。 配置Hibernate时,通常会在`Hibernate.cfg.xml`文件中定义数据库连接和其他属性。例如: ```xml <!DOCTYPE hibernate-configuration ...

    浅析常用数据库的自增字段创建方法汇总

    在数据库设计中,自增字段通常用于记录表中的唯一标识符,例如主键,它会自动递增,每次插入新记录时都会自动生成一个新值。以下是对几种常见数据库管理系统(DBMS)创建自增字段的方法的详细说明: 1. **DB2**: ...

    CRUD-todo-Node-Exp-ng-PostgreSQL:CRUD-todo-Node-Exp-ng-PostgreSQL

    概要 一个带有 PostgreSQL 的 CRUD Todo 应用程序,它使用 $... id:数据类型serial从 1 开始执行自动递增。它还确保该字段为Not Null 。 还将字段设置为主键, 文本:输入名称, 完成:类型布尔 安装 克隆存储库

    addrowid.zip

    "addrowid"可能是指在已有的数据库表中增加一个主键列,通常是整数类型,自动递增。在许多数据库系统中,如MySQL、PostgreSQL、Oracle等,都有内置的机制来自动为新插入的行生成主键值。例如,在MySQL中,可以使用`...

    JavaScript_一个用于PostgreSQL、MySQL、CockroachDB、SQL Server、SQLite3和

    `increments`和`string`分别用于创建自动递增的主键和字符串类型字段。 在查询数据时,Knex也提供了直观的API。以下是一个简单的查询示例: ```javascript knex('users') .where('firstName', 'John') .orWhere...

Global site tag (gtag.js) - Google Analytics