postgresql - 在创建用户所有评论的表时,使用 SERIAL 作为主键是否合适?

标签 postgresql primary-key ddl create-table

在使用 mongodb 一段时间后,我正在尝试学习 postgres,我想知道如何为每个 comment 设置一个唯一的 ID。

我有一个外键 userId,用户为其创建了评论,但对于主键,我需要某种类型的 commentId。可以为我的 commentId 使用 SERIAL 吗?或者,有没有像 UUID 这样更好的方法?我不知道我是否需要迁移数据。

最佳答案

由于您对评论 ID 的实际值不感兴趣(只是它存在并且是唯一的事实),serial 是此类列的不错选择。请注意,在现代 PostgreSQL 数据库(自 7.3 起)中,创建 serial 并不自动意味着它将具有唯一约束,因此您必须明确地处理它。例如:

CREATE TABLE comments (
    comment_id SERIAL PRIMARY KEY,
    user_id INT REFERENCES users(id), -- You should probably also index it
    comment VARCHAR(200) -- Or any other reasonable size
)

编辑:
要回答评论中的问题,可以为 UUID 列创建类似的行为,方法是为其指定新生成的 UUID 的默认值。

首先,您必须安装 postgres-contrib` 包(如果您还没有安装的话)。例如,在基于 Red Hat 的 linux 上,您可以运行(作为 root):

$ dnf install postgresql-contrib

然后,您需要从特权用户创建扩展:

CREATE EXTENSION IF NOT EXISTS "uuid-ossp";

这将创建一个您可以使用的 generate_uuid_v1 函数:

CREATE TABLE comments (
    comment_id UUID DEFAULT UUID_GENERATE_V1() PRIMARY KEY,
    user_id INT REFERENCES users(id), -- You should probably also index it
    comment VARCHAR(200) -- Or any other reasonable size
)

关于postgresql - 在创建用户所有评论的表时,使用 SERIAL 作为主键是否合适?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41975824/

相关文章:

sql - 如何最好地重新创建 Oracle 数据库?

sql - 没有在触发器函数中选择表的权限

sql - 将表拆分为多对多关系 : Data Migration

postgresql - 左外连接 - 如何返回第二个表中存在的 bool 值?

r - PL/R 函数接受两个表作为参数

hash - 什么是哈希和范围主键?

Mysql使用select按主键删除(错误1093)

PostgreSQL 在执行没有日志消息的 DDL 时挂起

mysql重启自动int主键

postgresql - PostgreSQL 在多大程度上支持并行 DDL?