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`**:这是最常用的策略,具体的生成方式由数据库供应商决定,...
2. **自动增长(Auto Increment)/标识列(Identity Column)**:在MySQL、SQL Server和PostgreSQL等数据库中,可以设置某列为主键并指定其为自动增长。每当插入新行时,数据库会自动为该列提供一个新的唯一值。 3....
在Java的持久化框架Hibernate中,主键生成策略是一个至关重要的概念,它决定了数据库表中主键值如何自动生成。主键通常是表中唯一标识记录的一列,对于数据的完整性和一致性至关重要。以下是对Hibernate中主键生成...
- **插入数据到serial类型的列中**:自动递增的字段。 - **插入空值**:如何正确插入NULL值。 - **使用\copy命令**:批量导入数据。 - **直接从另一个程序加载数据**:使用外部工具导入数据。 ##### 修改数据库中的...
【hibernate主键生成策略】是Hibernate框架中用于生成持久化对象主键的重要机制,它决定了如何在数据库中创建唯一的标识符。在SSH(Spring、Struts、Hibernate)架构中,Hibernate作为持久层框架,主键生成策略的...
Hibernate不参与主键的生成过程,这意味着你需要在调用save()之前通过setter方法为对象设置一个唯一的ID。这种方法虽然灵活,但可能导致并发问题,因此不推荐在多线程或分布式环境中使用。 配置示例: ```xml `...
这种策略要求用户在调用`save()`方法之前手动设置主键值。Hibernate不参与主键的生成,这意味着主键生成完全由应用控制,可以与数据库无关。这种方式虽然灵活,但可能导致主键冲突,因此不推荐使用。 2. **...
在SQL(Structured Query Language)中,自动编号是一种常见的数据库设计特性,主要用于为表格中的记录创建唯一的标识符。这种特性在数据库管理系统(如MySQL、SQL Server、Oracle、PostgreSQL等)中通常被称为序列...
- **应用场景**:当不确定具体使用哪种主键生成策略时,可以采用 native,让 Hibernate 自动选择最合适的策略。 ##### 8. uuid.hex - **定义**:由 Hibernate 基于 128 位唯一值产生算法生成 16 进制数值(编码后...
在数据库设计中,自增主键是一种常见的策略,它用于为表中的每一行生成一个唯一的标识符。在MyBatis这个流行的Java持久层框架中,处理自增主键的值通常涉及到插入数据后如何获取新生成的ID。下面将详细阐述MyBatis...
在Oracle、DB2和PostgreSQL这三种数据库管理系统中,Sequence都是内置的特性,允许用户创建并管理这样的自动递增序列。然而,值得注意的是,并非所有数据库系统都支持Sequence,比如MySQL、SQL Server和Sybase就没有...
代理键(Surrogate Key)是一种额外的主键,通常用自动递增的数字来标识记录,如`CoursePlanID`和`CourseRegID`,这可以避免主键因业务规则变化而更改。 6. **定义实体完整性** 实体完整性通过设置主键约束来实现...
3. 数据库迁移:在创建表的迁移文件中,设置主键为UUID类型,如在MySQL中使用`binary(16)`或`char(36)`,在PostgreSQL中使用`uuid`。 ```php public function up() { Schema::create('my_models', function ...
在Hibernate框架中,提供了多种主键生成策略,每种策略都有其适用场景。本文将详细介绍这些生成策略,并给出相应的应用场景分析。 #### 二、主键生成策略 1. **assigned** - **定义**:这种方式由程序员负责分配...
10. **assigned**: 主键值由应用程序自己设定,需在调用`save()`方法前完成。 配置Hibernate时,通常会在`Hibernate.cfg.xml`文件中定义数据库连接和其他属性。例如: ```xml <!DOCTYPE hibernate-configuration ...
在数据库设计中,自增字段通常用于记录表中的唯一标识符,例如主键,它会自动递增,每次插入新记录时都会自动生成一个新值。以下是对几种常见数据库管理系统(DBMS)创建自增字段的方法的详细说明: 1. **DB2**: ...
概要 一个带有 PostgreSQL 的 CRUD Todo 应用程序,它使用 $... id:数据类型serial从 1 开始执行自动递增。它还确保该字段为Not Null 。 还将字段设置为主键, 文本:输入名称, 完成:类型布尔 安装 克隆存储库
"addrowid"可能是指在已有的数据库表中增加一个主键列,通常是整数类型,自动递增。在许多数据库系统中,如MySQL、PostgreSQL、Oracle等,都有内置的机制来自动为新插入的行生成主键值。例如,在MySQL中,可以使用`...
`increments`和`string`分别用于创建自动递增的主键和字符串类型字段。 在查询数据时,Knex也提供了直观的API。以下是一个简单的查询示例: ```javascript knex('users') .where('firstName', 'John') .orWhere...