【问题标题】:Postgresql UPDATE syntax error on RAISE exception in CASE / IF condition在 CASE / IF 条件下 RAISE 异常的 Postgresql UPDATE 语法错误
【发布时间】:2019-09-26 06:51:49
【问题描述】:

我对使用 CASE(或 IF)条件编写 Postgresql UPDATE 查询感到困惑。

预期行为:如果某个特定字段不为空,我必须引发异常并且不进行更新。 当前行为:我尝试了 CASE 和 IF 条件,但每次我遇到语法错误:SQL 错误 [42601]: ERROR: syntax error at or near "exception"。 想法:也许有一种方法可以通过向表格添加约束来达到相同的结果?

    UPDATE public.SomeTable 
SET Title = (
    case when EndDate IS null
        THEN 'new title' 
        ELSE raise exception 'Cannot update entity if EndDate is not null'
    end),
    Description = (
    case when EndDate IS null
        THEN 'new description' 
        ELSE raise exception 'Cannot update entity if EndDate is not null'
    end)
WHERE Id=4 

版本: x86_64-pc-linux-gnu 上的 PostgreSQL 11.5 (Debian 11.5-1.pgdg90+1),由 gcc (Debian 6.3.0-18+deb9u1) 6.3.0 20170516, 64-bit 编译

【问题讨论】:

  • 您不能在 SQL 查询中使用 RAISE。这是一个只能“独立”使用的 PL/pgSQL 语句
  • 我认为您需要使用触发器来执行此操作。
  • 注意:RAISE 影响(回滚)整个交易。您不能逐行提高。

标签: sql postgresql sql-update sqlexception


【解决方案1】:

我能想到的唯一相对方便的方法是使用可更新视图:

create view vw_sometable as
    select t.*
    from sometable t
    where endDate is null
    with check option;

然后您将插入到视图中,而不是插入到基础表中。

您可以通过授予update 对视图而不是对基础表的权限来进一步完善这一点,因此所有updates 都需要通过视图。

好吧,另一种方法不会返回错误,但不会更新行。只需在where 子句中包含条件即可:

UPDATE public.SomeTable 
    SET Title = 'new title',
        Description = 'new description' 
WHERE Id = 4 AND EndDate is null';

您可以添加后续逻辑来检查是否有任何行被更新并在那里引发错误。

【讨论】:

    【解决方案2】:

    结束后删除大小写

    UPDATE public.SomeTable 
    SET Title = (
        case when EndDate IS null
            THEN 'new title' 
            ELSE 'Cannot update entity if EndDate is not null'
        end ),
        Description = (
        case when EndDate IS null
            THEN 'new description' 
            ELSE 'Cannot update entity if EndDate is not null'
        end )
    WHERE Id=4 
    

    【讨论】:

    • 感谢您的回答,但这并不能解决问题
    • hm,这意味着如果 EndDate 不为空,则字段将更新为“如果 EndDate 不为空,则无法更新实体”字符串。这与我需要的相反。在这种情况下我想抛出一些错误
    猜你喜欢
    • 1970-01-01
    • 2010-10-22
    • 1970-01-01
    • 2012-09-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-09
    • 1970-01-01
    相关资源
    最近更新 更多