我有一个 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值生成序列号的函数。
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
承蒙订购。