PostgreSQL 主键自增

PostgreSQL 提供了一种便捷的方式来创建自增列,这在需要为每一行生成唯一标识符时非常有用。本教程将介绍如何在 PostgreSQL 中使用自增列,并结合 Java 代码示例说明其实际应用。

1. 在 PostgreSQL 中创建带有自增列的表

在 PostgreSQL 中,我们可以使用SERIAL数据类型来创建自增列。SERIAL是一个伪类型,它实际上创建了一个整数列并为其设置了一个序列生成器。

以下是一个创建带有自增主键的表的例子:

CREATE TABLE asked_questions (
  id SERIAL PRIMARY KEY,
  created_at TIMESTAMPTZ NOT NULL DEFAULT now(),
  content VARCHAR(255) NOT NULL
);

在这个例子中:

  • id列被定义为SERIAL PRIMARY KEY。这意味着:
    • id将自动递增
    • id将作为表的主键
  • created_at列使用TIMESTAMPTZ类型,并设置默认值为当前时间戳
  • content列用于存储问题内容,最大长度为 255 个字符

2. 自增列的工作原理

当你使用SERIAL时,PostgreSQL 会:

  1. 创建一个整数列
  2. 创建一个关联的序列
  3. 将列的默认值设置为从序列中获取下一个值

这意味着,当你插入新行而不指定 ID 时,PostgreSQL 会自动为id列生成下一个可用的整数值。

3. 在 Java 中使用自增列

使用 JFinal 框架,我们可以轻松地操作带有自增列的表。以下是一个示例服务类:

import com.litongjava.jfinal.plugin.activerecord.Db;
import com.litongjava.jfinal.plugin.activerecord.Record;
import com.litongjava.open.chat.constants.TableNames;

public class AskedQuestionService {
  public boolean create(String question) {
    return Db.save(new Record().setTableName(TableNames.asked_questions).set("content", question));
  }
}

这个服务类有一个create方法,它接受一个问题字符串并将其保存到数据库中。注意,我们只设置了content字段,而没有设置id字段。这是因为 PostgreSQL 会自动为id生成一个值。

4. 测试自增列

以下是一个测试类,用于验证自增列的功能:

import org.junit.Test;
import com.litongjava.jfinal.aop.Aop;
import com.litongjava.open.chat.config.DbConfig;
import com.litongjava.tio.utils.environment.EnvUtils;

public class AskedQuestionServiceTest {
  @Test
  public void test() {
    EnvUtils.load();
    new DbConfig().config();
    String question = "How are you";
    boolean create = Aop.get(AskedQuestionService.class).create(question);
    System.out.println(create);
  }
}

这个测试方法会:

  1. 加载环境变量
  2. 配置数据库连接
  3. 创建一个新的问题记录
  4. 打印操作是否成功

每次运行这个测试,都会在数据库中创建一个新的记录,并且id列会自动增加。

5. 自增列的优势

使用自增列有以下几个优点:

  1. 自动生成唯一标识符,无需手动管理
  2. 提高插入性能,因为不需要查询最大 ID 再加 1
  3. 避免并发插入时的 ID 冲突