Loading [MathJax]/jax/output/CommonHTML/config.js
社区首页 >问答首页 >如何在PostgreSQL中生成唯一的时间戳?

如何在PostgreSQL中生成唯一的时间戳?
EN

Stack Overflow用户
提问于 2016-01-15 18:48:26
回答 2查看 2.7K关注 0票数 1

我的想法是实现一个基本的“向量时钟”,其中时间戳是基于时钟的,总是向前走,并且保证是唯一的。

例如,在一个简单的表格中:

代码语言:javascript
代码运行次数:0
复制
CREATE TABLE IF NOT EXISTS timestamps (
    last_modified TIMESTAMP UNIQUE
);

在插入之前,我使用触发器设置时间戳值。基本上,当两个插入同时到达时,它就会进入未来:

代码语言:javascript
代码运行次数:0
复制
CREATE OR REPLACE FUNCTION bump_timestamp()
RETURNS trigger AS $$
DECLARE
    previous TIMESTAMP;
    current TIMESTAMP;
BEGIN
     previous := NULL;
     SELECT last_modified INTO previous
      FROM timestamps
     ORDER BY last_modified DESC LIMIT 1;

     current := clock_timestamp();
     IF previous IS NOT NULL AND previous >= current THEN
        current := previous + INTERVAL '1 milliseconds';
     END IF;
     NEW.last_modified := current;
     RETURN NEW;
END;
$$ LANGUAGE plpgsql;

DROP TRIGGER IF EXISTS tgr_timestamps_last_modified ON timestamps;

CREATE TRIGGER tgr_timestamps_last_modified
BEFORE INSERT OR UPDATE ON timestamps
FOR EACH ROW EXECUTE PROCEDURE bump_timestamp();

然后,我在两个独立的客户机中运行大量的插入操作:

代码语言:javascript
代码运行次数:0
复制
DO
$$
BEGIN
    FOR i IN 1..100000 LOOP
       INSERT INTO timestamps DEFAULT VALUES;
    END LOOP;
END;
$$;

不出所料,我得到了冲突:

代码语言:javascript
代码运行次数:0
复制
ERROR: duplicate key value violates unique constraint "timestamps_last_modified_key"
État SQL :23505
Détail :Key (last_modified)=(2016-01-15 18:35:22.550367) already exists.
Contexte : SQL statement "INSERT INTO timestamps DEFAULT VALUES"
PL/pgSQL function inline_code_block line 4 at SQL statement

@rach suggestedcurrent_clock()SEQUENCE对象混合在一起,但这可能意味着要摆脱TIMESTAMP类型。尽管我真的想不出它是如何解决隔离问题的。

有没有一个通用的模式来避免这种情况?

感谢您的见解:)

EN

回答 2

Stack Overflow用户

发布于 2016-01-15 19:29:52

我的两点意见(灵感来自http://tapoueh.org/blog/2013/03/15-batch-update)。

尝试在大量插入之前添加以下内容:

代码语言:javascript
代码运行次数:0
复制
LOCK TABLE timestamps IN SHARE MODE;

官方文档在这里:http://www.postgresql.org/docs/current/static/sql-lock.html

票数 1
EN

Stack Overflow用户

发布于 2016-01-15 19:23:03

如果你像你说的那样只有一个Postgres服务器,我认为使用时间戳+序列可以解决这个问题,因为序列是非事务性的,并且尊重插入顺序。如果你有db分片,那么它将会复杂得多,但也许BDR中2nd象限的分布式序列可能会有所帮助,但我不认为有序性会得到尊重。我在下面添加了一些代码,如果你已经设置好测试它的话。

代码语言:javascript
代码运行次数:0
复制
CREATE SEQUENCE "timestamps_seq";

-- Let's test first, how to generate id.
SELECT extract(epoch from now())::bigint::text || LPAD(nextval('timestamps_seq')::text, 20, '0') as unique_id ;

           unique_id
--------------------------------
 145288519200000000000000000010
(1 row)


CREATE TABLE IF NOT EXISTS timestamps (
    unique_id TEXT UNIQUE NOT NULL DEFAULT extract(epoch from now())::bigint::text || LPAD(nextval('timestamps_seq')::text, 20, '0')
);


INSERT INTO timestamps DEFAULT VALUES;
INSERT INTO timestamps DEFAULT VALUES;
INSERT INTO timestamps DEFAULT VALUES;

select * from timestamps;
           unique_id
--------------------------------
 145288556900000000000000000001
 145288557000000000000000000002
 145288557100000000000000000003
(3 rows)

如果有效的话,请告诉我。我不是数据库管理员,所以也许在dba.stackexchange.com上询问一下潜在的副作用也会很好。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34817760

复制
相关文章
MySQL设置字段的默认值为当前系统时间
问题产生: 当我们在对某个字段进行设置时间默认值,该默认值必须是的当前记录的插入时间,那么就将当前系统时间作为该记录创建的时间。 应用场景: 1、在数据表中,要记录每条数据是什么时候创建的,应该由数据库获取当前时间自动记录创建时间。 2、在数据库中,要记录每条数据是什么时候修改的,应该而由数据数据库获取当前时间自动记录修改时间。 实际开发: 记录用户的注册时间、记录用户最后登录时间、记录用户的注销时间等。 实现步骤:(如果使用数据库远程工具则直接设置,更简单!!!) 首先将数据表中字段的数据类型设置为TIM
赵小忠
2018/01/24
9.2K0
MySQL字段默认值设置详解
在 MySQL 中,我们可以为表字段设置默认值,在表中插入一条新记录时,如果没有为某个字段赋值,系统就会自动为这个字段插入默认值。关于默认值,有些知识还是需要了解的,本篇文章我们一起来学习下字段默认值相关知识。
MySQL技术
2021/03/04
10.5K0
如何在CDH中为Kafka设置流量配额
温馨提示:如果使用电脑查看图片不清晰,可以使用手机打开文章单击文中的图片放大查看高清原图。 Fayson的github: https://github.com/fayson/cdhproject 提示:代码块部分可以左右滑动查看噢 1.文档编写目的 ---- 从0.9版本开始,Kafka集群新增了针对生产和消费请求进行配额(quotas)控制。本篇文章Fayson主要介绍如何在CDH中为Kafka设置流量配额。 文档概述 1.环境准备 2.Producer和Consumer流量配额测试 3.总结 测试环境
Fayson
2018/07/13
2.8K0
Hive应用:设置字段默认值 原
当我们清理了一些数据之后,数据的某些字段在数据中是没有的但是需要保留这个字段,那么我们将数据插入中转表中时,就需要给这个字段赋予默认值,来让语句正确执行。
云飞扬
2019/03/13
5.2K0
Python中字段抽取、字段拆分、记录抽取
1、字段抽取 字段抽取是根据已知列数据的开始和结束位置,抽取出新的列 字段截取函数:slice(start,stop) 注意:和数据结构的访问方式一样,开始位置是大于等于,结束位置是小于。 from pandas import read_csv df = read_csv( 'D:\\PDA\\4.6\\data.csv' ) #默认将电话号码按照数值型来处理了,需要先转换为字符型,astype df['tel'] = df['tel'].astype(str) #运营商 bands = df[
Erin
2018/01/09
3.3K0
layui怎么表格中显示图片&&layui为字段设置默认排序
未经允许不得转载:肥猫博客 » layui怎么表格中显示图片&&layui为字段设置默认排序
超级小可爱
2023/02/20
1.5K0
AWK中的字段,记录和变量【Programming】
本文为awk入门系列的第二篇文章,在本篇文章中,你可以了解到有关字段,记录和一些功能强大的awk变量。
Potato
2019/11/09
2.1K0
AWK中的字段,记录和变量【Programming】
golang中函数如何设置参数默认值
这个问题相当麻烦,根据golang-nuts/google groups中的这篇文章,golang现在与将来都不会支持参数默认值。Go始终在使得自己变得尽可能的简单,而增加这种额外的支持会使parser变得更复杂。
千灵域
2022/06/17
14.4K0
android在代码中怎么设置 RadioGroup的默认值
这种需求一般是   个人中心 需要的   当用户修改了个人资料之后,下次在修改的话需要从服务器中拿到数据   
wust小吴
2019/07/08
5.2K0
Java去除对象中为null的字段
如果返回的是对象 model 转成的 json,那么 json 中会存在 “xxxx” : null。和前端进行交互时在使用Swagger调试接口的时候会出现接口数据中有 null值,结果很难看:
Jensen_97
2023/07/20
7890
Java去除对象中为null的字段
为字段设置初始值
在开发中为字段设置初始值这是最基本的要求,但是很多开发人员会在构造函数变多的时候忘记给成员变量设置初始值。为了避免这个问题,我们最好在声明的时候直接初始化,而不是在实现构造函数的时候去初始化。编译器会帮助开发人员在每个构造函数开头放入一段代码,这段代码会把开发人员在定义成员字段时所指定的初始值设置给这些成员字段。如果没有显示定义构造函数,那么编译器就会先创建默认构造函数,之后再向其中加入初始化代码。
喵叔
2020/09/08
1.6K0
使用easyui框架中的from表单设置数字默认值和日期默认值
使用easyui框架中的from表单设置数字默认值和日期默认值
Java架构师必看
2021/05/14
4.3K0
使用easyui框架中的from表单设置数字默认值和日期默认值
java中给方法的参数设置默认值,java设置可选参数
今天在调整一个定时任务时需要将固定写死的查询日期通过外部传参来控制,如果没有传值给个默认值,于是了解了下java函数的参数默认值
高久峰
2023/06/29
7.7K0
SAP-如何设置物料移动中的某个字段为必输项?
ANSWER:执行IMG -> Material Management -> Inventory Management and Physical Inventory -> Movement Types -> Copy, Change Movement Types (OMJJ),找到并选中移动类型261,然后在左边的功能树中,选择“Field selection (Enjoy)”,双击打开,如下图:
用户5495712
2019/05/29
4K0
如何在Python 中更优雅的记录日志?
在 Python 中,一般情况下我们可能直接用自带的 logging 模块来记录日志,包括我之前的时候也是一样。在使用时我们需要配置一些 Handler、Formatter 来进行一些处理,比如把日志输出到不同的位置,或者设置一个不同的输出格式,或者设置日志分块和备份。但其实个人感觉 logging 用起来其实并不是那么好用,其实主要还是配置较为繁琐。
Python数据科学
2019/10/15
1.1K0
如何在Python 中更优雅的记录日志?
如何在Python中实现高效的日志记录
日志记录是软件开发中的重要组成部分,它可以帮助我们监控程序运行状态、诊断问题和优化性能。本文将详细介绍如何在Python中实现高效的日志记录,并提供详细的代码示例。
华科云商小彭
2023/08/29
4180
如何在Python中实现高效的日志记录
Pulumi 如何在 Windows 环境中设置
没有安装文件, Pulumi 没有安装文件,所以你不能按照下载后安装的方式来进行配置。
HoneyMoose
2021/05/21
2K0
Pulumi 如何在 Windows 环境中设置
swagger中参数为数组dataType的设置
swagger中参数为数组dataType的设置
Java架构师必看
2021/09/22
3.5K0
swagger中参数为数组dataType的设置
点击加载更多

相似问题

相同结构变量的多个声明,好吗?

21

查找具有相同标题的多个窗口

21

共享相同标题的多个布局页

22

将相同的输出写入多个日志

21

多个MKPlacemarks的MKMapView显示相同的标题

12
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文