【问题标题】:Ordering with PostgreSQL trigger when updating and inserting更新和插入时使用 PostgreSQL 触发器进行排序
【发布时间】:2019-10-01 21:19:13
【问题描述】:

我希望根据变量对行进行排序。我把头发拉出来,试图把我的头缠在这种触发器上。我只写过从其他表中获取一些值的触发器。

示例: 我有列的行让我们说:名称和顺序。

CREATE TABLE buildorder (
    name VARCHAR NOT NULL,  
    order_buildorder INT,
);

INSERT INTO buildorder (name, order_buildorder) VALUES ('Gateway', 1);
INSERT INTO buildorder (name, order_buildorder) VALUES ('Pylon', 2);

现在我不按顺序插入,但 ON INSERT 触发器应该自动使其变为 3

INSERT INTO buildorder (name) VALUES ('Probe');

但现在我们将第三个构建顺序更新为第一个位置

UPDATE buildorder
SET order_buildorder = 1
WHERE name = 'Probe'

所有其他行现在应该更改以反映这种排序更改。我将如何为此编写触发器?

示例结果:

[
{name = "Gateway", order_buildorder = 2},
{name = "Pylon", order_buildorder = 3},
{name = "Probe", order_buildorder = 1},
]

【问题讨论】:

    标签: sql postgresql triggers database-trigger


    【解决方案1】:

    这是一个糟糕的主意。

    改为将order_buildorder 定义为real 列。

    这样,您始终可以在两个已经存在的行之间插入一个新行以进行排序,而无需更新现有行(只需取您要插入的值的算术平均值)。

    如果您需要积分顺序,请在选择数据时使用窗口函数即时生成它。

    【讨论】:

    • 感谢这是一个有趣的解决方案。我可能会这样做。我也在探索使用哪个项目在当前项目之前的可能性。您选择此解决方案的任何原因?
    • 是的,因为您总是可以在两个给定的数字之间找到double precision 数字,因此您可以在任何地方插入值,而无需重新调整所有内容。 PostgreSQL 枚举就是这样实现的。
    • 有道理我决定做你的解决方案。谢谢
    • 为什么是double precision(8 个字节)而不是real(4 个字节)? 6位小数精度不够?
    • @ManUtopiK 你说得对,real 更好。我修改了答案。
    猜你喜欢
    • 2013-01-24
    • 2014-01-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-26
    • 1970-01-01
    相关资源
    最近更新 更多