为什么在为 PostgreSQL 创建视图时忽略排序?

问题描述 投票:0回答:1

我有一个 PostgreSQL(版本 12.15)数据库,其中有一个如下表:

id 创建于 数字 聊天ID
... 2023-08-10 21:44:19.272299 0 27936
... 2023-08-09 10:32:28.850167 0 27936
... 2023-08-08 17:32:11.207523 0 27936
... 2023-08-07 17:16:52.068309 0 27936
... 2023-08-06 17:15:47.014364 0 27936

此结果是从查询中收到的

SELECT * 
FROM _table_name 
WHERE chat_id = '27936' 
ORDER BY created_at DESC

为了记下

number
的值,我执行以下查询:

CREATE VIEW view_message 
AS 
    SELECT * 
    FROM _message 
    ORDER BY created_at;

CREATE RULE rule_message AS ON UPDATE TO view_message
    DO INSTEAD UPDATE _message SET number = NEW.number WHERE id = NEW.id;

UPDATE view_message
SET number = create_message_sequence_number(chat_id::text);

但之后我就跑了

SELECT * 
FROM _table_name 
WHERE chat_id = '27936' 
ORDER BY created_at DESC

再次,我得到这样的输出(

number
值是错误的):

id 创建于 数字 聊天ID
... 2023-08-10 21:44:19.272299 83 27936
... 2023-08-09 10:32:28.850167 82 27936
... 2023-08-08 17:32:11.207523 33 27936
... 2023-08-07 17:16:52.068309 82 27936
... 2023-08-06 17:15:47.014364 120 27936

number
将在最上面的行中达到最大,并为每个连续的行递减 1。

创建视图时似乎没有考虑到

ORDER BY created_at
。但我仍然不明白到底发生了什么以及为什么会发生错误。


create_message_sequence_number
是根据传递的id值生成序列号的函数。

sql postgresql sql-view
1个回答
0
投票

创建视图

CREATE VIEW 定义查询的视图。该视图并未物理实体化。相反,每次在查询中引用视图时都会运行查询。

create table order_test(id integer, fld_1 varchar);

insert into order_test values (1, 'dog'), (2, 'fish'), (3, 'cat');

select * from order_test;
 id | fld_1 
----+-------
  1 | dog
  2 | fish
  3 | cat
(3 rows)

create view vw_order_test as select * from order_test order by fld_1;

select * from vw_order_test ;
 id | fld_1 
----+-------
  3 | cat
  1 | dog
  2 | fish
(3 rows)

insert into order_test values (4, 'aardvark');

select * from order_test;
 id |  fld_1   
----+----------
  1 | dog
  2 | fish
  3 | cat
  4 | aardvark


select * from vw_order_test ;
 id |  fld_1   
----+----------
  4 | aardvark
  3 | cat
  1 | dog
  2 | fish

承蒙订购。

© www.soinside.com 2019 - 2024. All rights reserved.