sql - PostgreSQL表设计——如何避免重复使用ID

标签 sql postgresql

我正在使用 Postgres 数据库设计一个具有相当复杂的表设计的应用程序,但我被困在一个问题上,我希望有人能够提供建议。

我有几个表,每个表都有一个功能 id(或 fid)。不同类型的实体具有不同的属性模式,因此我必须为每种类型创建不同的表。但是,我想确保 fid 在所有实体类型中都是唯一的。

如果我有三种实体类型,Entity1/2/3,由以下 3 个表表示:

Entity1             Entity2             Entity3
    fid                 fid                 fid
    attribute1          attribute2          attribute3

如何确保系统中任何地方不存在重复的 fid?

谢谢!

最佳答案

PostgreSQL(以及 Oracle)使用称为 Sequences 的对象来生成序列值。与 MySQL 和 SQL Server 的序列值生成方法不同,序列不与表绑定(bind)。因此,您可以定义单个序列( documentation link ):

CREATE SEQUENCE your_seq 

这将创建一个名为 your_seq 的序列,该序列将从 1 开始,每次检索下一个值时都会增加 1 - 如果要设置最小值和增量值,请参阅文档链接/etc 不同。

要使用它,任何 INSERT 语句都需要包含:

NEXTVAL('your_seq')

...在 INSERT 语句中的位置填充相应的列。 IE:

INSERT INTO entity1
  (fid)
VALUES
  (NEXTVAL('your_seq'))

并且,为了进一步自动化此操作,您可以将 NEXTVAL('your_seq') 设置为所有使用它的表的默认值。

关于sql - PostgreSQL表设计——如何避免重复使用ID,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3527519/

相关文章:

ruby-on-rails - 在安装 PostgreSQL 后发现 ruby​​、rails、git 时出现问题

sql - 在 Postgres 中批量更新

sql - 如何重命名 SQL 表列名称而不破坏内容

SQL 更新集与作用于其他表的Where

postgresql - 预加载 : How to disable specific fields of included table

SQL(简单)逐行连接两个表

node.js - 计算两个日期之间符合条件的行数

c# - ASP.NET - 实现搜索功能和 SQL

sql - 如何避免子查询以获得性能

mysql - 一种仅保留和更新 TYPE=3 行的方法