Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql Postgres:在创建行时(除非已更新),是否保证两列具有DEFAULT NOW()的时间戳类型相等?_Sql_Postgresql - Fatal编程技术网

Sql Postgres:在创建行时(除非已更新),是否保证两列具有DEFAULT NOW()的时间戳类型相等?

Sql Postgres:在创建行时(除非已更新),是否保证两列具有DEFAULT NOW()的时间戳类型相等?,sql,postgresql,Sql,Postgresql,例如,我有一个CREATE TABLE,它有两个列,这两个列具有DEFAULT NOW(),因此当创建新行时,它会自动设置为当前的时间戳: create table threads(threadid uuid PRIMARY KEY default uuid_generate_v4(), reply_to uuid REFERENCES threads(threadid), comment text not null, created_at TIMESTAMP WITH TIME ZONE NO

例如,我有一个
CREATE TABLE
,它有两个列,这两个列具有
DEFAULT NOW()
,因此当创建新行时,它会自动设置为当前的
时间戳

create table threads(threadid uuid PRIMARY KEY default uuid_generate_v4(), reply_to uuid REFERENCES threads(threadid), comment text not null, created_at TIMESTAMP WITH TIME ZONE NOT NULL DEFAULT NOW(), modified_at TIMESTAMP WITH TIME ZONE NOT NULL DEFAULT NOW());
以及一些示例插入:

insert into threads (threadid, reply_to, comment) values ('40ad95dd-d64e-421a-a4f3-bf7b7017d99a',null,'WOW');
insert into threads (threadid, reply_to, comment) values ('5fe62a5d-e8de-4d3a-935c-a97087168e60','40ad95dd-d64e-421a-a4f3-bf7b7017d99a','MUCH WOW');
insert into threads (threadid, reply_to, comment) values ('f2e41c30-49d5-4420-9aac-00cf98b3d696','5fe62a5d-e8de-4d3a-935c-a97087168e60','WHAT?');
insert into threads (threadid, reply_to, comment) values ('e3f41c30-49d5-4420-9aac-00cf98b3d696','5fe62a5d-e8de-4d3a-935c-a97087168e60','MUCH WOW TO WHAT?');
insert into threads (threadid, reply_to, comment) values ('3c6eccbf-fca4-4c53-9d33-034a32e9b6eb','40ad95dd-d64e-421a-a4f3-bf7b7017d99a','0_0');
insert into threads (threadid, reply_to, comment) values ('ad5d7fc3-fc3a-48d6-ae3c-db8a37ba3464','40ad95dd-d64e-421a-a4f3-bf7b7017d99a','WOW WHAT??');
insert into threads (threadid, reply_to, comment) values ('32ad95dd-d64e-421a-a4f3-bf7b7017d99a',null,'Awesome sauce!');
是否保证两列具有完全相同的时间戳?(显然,只要该列没有更新以触发在处更新
modified_)

从我迄今为止的简单测试来看,它们似乎总是相等的,但我希望得到更好的确认:

select created_at, modified_at from threads ;
          created_at           |          modified_at          
-------------------------------+-------------------------------
 2021-01-30 06:38:07.676708-05 | 2021-01-30 06:38:07.676708-05
 2021-01-30 06:38:07.678601-05 | 2021-01-30 06:38:07.678601-05
 2021-01-30 06:38:07.678977-05 | 2021-01-30 06:38:07.678977-05
 2021-01-30 06:38:07.679341-05 | 2021-01-30 06:38:07.679341-05
 2021-01-30 06:38:07.679547-05 | 2021-01-30 06:38:07.679547-05
 2021-01-30 06:38:07.679734-05 | 2021-01-30 06:38:07.679734-05
 2021-01-30 06:38:36.878027-05 | 2021-01-30 06:38:36.878027-05

我对文档的理解是,如果
now()
的两个用法在同一个命令中,它们将同时返回

以下是文件-阅读最后一行

事务_timestamp()相当于当前的_timestamp,但其命名是为了清楚地反映它返回的内容。语句_timestamp()返回当前语句的开始时间(更具体地说,是从客户端接收最新命令消息的时间)。语句_timestamp()和事务_timestamp()在事务的第一个命令期间返回相同的值,但在后续命令期间可能会有所不同。clock_timestamp()返回实际的当前时间,因此即使在单个SQL命令中,其值也会发生变化。timeofday()是一个历史PostgreSQL函数。与clock_timestamp()类似,它返回实际的当前时间,但作为格式化的文本字符串,而不是带有时区值的时间戳。now()是一个传统的PostgreSQL,相当于事务\u timestamp()

应该是。Now()将为单个事务中的每个调用返回相同的值。请查看以下链接:

“now()是一种传统的PostgreSQL,相当于transaction_timestamp()……transaction_timestamp()在事务的第一个命令期间返回相同的值”似乎回答了我的问题,即在我的情况下,它们将保持不变。如果我在一个
函数中执行多个操作
或者有触发器,就需要小心了。