【问题标题】:How to make a PG function and trigger from SQL syntax?如何从 SQL 语法中创建 PG 函数和触发器?
【发布时间】:2020-09-25 06:56:22
【问题描述】:

我目前正在使用这种 SQL 语法在检查另一个表中的值后更新一个表的所有记录:

UPDATE schema.table1 AS c 
SET field1 = 'SI'
FROM schema.table2 AS s
WHERE
c.specie = s.diam20 AND c.specie IS NOT NULL AND c.circonf/PI() >= 0.20
OR
c.specie = s.diam40 AND c.specie IS NOT NULL AND c.circonf/PI() >= 0.40
OR
c.specie = s.diam60 AND c.specie IS NOT NULL AND c.circonf/PI() >= 0.60
OR
c.specie = s.diam80 AND c.specie IS NOT NULL AND c.circonf/PI() >= 0.80;

对不起,我是新手,所以我尝试在每次插入或更新表 1 后设置一个触发器,该触发器会更新 field1 的值,调用一个能够执行上述操作的 PG 函数。 请你帮助我好吗? 提前致谢

【问题讨论】:

    标签: sql postgresql sql-update database-trigger sql-view


    【解决方案1】:

    为什么不简单地创建一个视图来显示这些派生信息,而不是存储您随后需要管理的数据?

    好处是您可以随时了解最新数据,无需任何维护成本。

    这应该很简单:

    create view view1 as
    select 
        t1.*, 
        case when exists (
            select 1
            from table2 t2
            where t1.specie = case
                when t1.circonf / pi() >= 0.80 then t2.diam20 
                when t1.circonf / pi() >= 0.60 then t2.diam40 
                when t1.circonf / pi() >= 0.40 then t2.diam60 
                when t1.circonf / pi() >= 0.20 then t2.diam80
            end
        ) then 'SI' end as field1
    from table1 t1
    

    旁注:您应该尝试修复您的架构 - 连接逻辑表明它未正确规范化。您应该将table2 的四个diam* 列中的每一个都存储在行而不是列中,并在其他列中指定范围,例如:

    min_cicronf    max_circonf    diam
    0.20 * pi()    0.40 * pi()    ...
    0.40 * pi()    0.60 * pi()    ...
    0.60 * pi()    0.80 * pi()    ...
    0.80 * pi()    null           ...
    

    那么查询可以简化为更简单更高效:

    create view view1 as
    select 
        t1.*, 
        case when exists (
            select 1
            from table2 t2
            where 
                t1.specie = t2.diam
                and t1.circonf >= t2.min_cicronf
                and (t1.circonf < t2.max_cicronf or t2.max_circonf is null)
        ) then 'SI' end as field1
    from table1 t1
    

    【讨论】:

    • 谢谢@GMB 我会评估您关于修复架构的建议,但也许我没有很好地解释自己。当插入一个新点并只写入几个值时,我想创建一个触发器和函数,在检查其他表中的一些参数后自动将新数据插入其他列中,这些列的值是设置的。我想要一种从少数输入值计算的新数据的自动插入。我在开头写的例子是我对整个表的查询,我想要一个函数来插入每条新记录。谢谢
    • @ocelot73。是的,我想我正确理解了你的问题。我的建议是将计算逻辑放在 SQL 视图中,而不是实际存储值。
    • 我确实需要存储值,可能会自动插入到我在同一记录中输入新数据的同一个表中。 (到目前为止,我可以使用第一篇文章中的查询一次更新整个表)
    猜你喜欢
    • 2022-01-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多