【问题标题】:Is row created timestamp is unique in a table?行创建的时间戳在表中是唯一的吗?
【发布时间】:2018-09-27 09:20:27
【问题描述】:

我知道时间戳是某一时刻的时间实例。

但是来到我的桌子,我的桌子没有主键。

所以我需要一个唯一的交易列。

我应该将行创建的时间戳列具有唯一的表列。

表定义

Create Table order_processing_logs(
    order_number integer,
    processing_status integer,
    cust_id character varying(200),
    vendor_id character varying(200),
    .
    .
    .
    .
    .
    .,etc,
    created_time timestamp without time zone DEFAULT now(),
    updated_time timestamp without time zone DEFAULT now()
); 

我应该将 created_time 作为表中的唯一列吗?

现在,如果我更改表的架构,它将影响数百万条记录。

【问题讨论】:

    标签: sql postgresql postgresql-10 postgresql-11


    【解决方案1】:

    没有。通常,您不能确定没有两行完全相同。

    如果您使用的是同时提交所有行的事务,这将更加关键。这个小提琴表明两行的时间戳是相等的:demo: db<>fiddle

    也许你可以使用两列的组合作为

    PRIMARY KEY (order_number, current_timestamp)
    

    但由于您无法确保每列(或组合)的唯一性,因此您永远不会安全。


    最好添加一个类型为serial 的列,它是一个自动增加的 (bigint) 数字。

    Postgres 10 开始,您可以使用 GENERATE IDENTITY 代替 serial 类型:

    id INT GENERATED ALWAYS AS IDENTITY
    

    (http://www.postgresqltutorial.com/postgresql-identity-column/)

    【讨论】:

    • 时间戳表示以毫秒为单位也算naa
    • 那么没有主键或唯一列的最佳方法是什么
    • @RatanUdayKumar 这意味着,这将是一个独特的机会,但它不是 100% 安全的。同时提交的事务呢?
    • @RatanUdayKumar 这个小提琴显示了交易问题
    • 也许我必须将另一列与 created_time 结合使用
    【解决方案2】:

    我认为仅使用 created_time 是不明智的,因为可能会同时放置 2 个不同的订单

    我更喜欢 order_number,created_time 列的组合以使其独一无二

    【讨论】:

    • 时间戳表示以毫秒为单位也算naa
    • 那么没有主键或唯一列的最佳方法是什么
    • 唯一键和主键之间的区别非常小,因此您可以创建其中一个
    猜你喜欢
    • 2012-02-29
    • 2012-05-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-15
    • 1970-01-01
    • 2013-12-05
    相关资源
    最近更新 更多