带有导致歧义的更新和选择语句的 PostgreSQL 返回表

标签 postgresql sql-update plpgsql

我正在为我的一个 friend 开发一个小型艺术画廊网站,出于各种原因我决定使用 PostgreSQL。到目前为止一切正常,但我遇到了一个小问题。问题在于以下功能。

viewcount 列存在歧义问题。冲突发生在更新语句和返回表之间。除了将返回表列 viewcount 更改为类似 View 或创建另一个函数来更新计数之外,我不太确定如何解决此问题。

我的 SQL 基础知识来 self 使用 MSSQL 的工作。

create or replace function submission_getone
(
    int         -- submissionid
    ,boolean    -- upcount
    ,int        -- mmask
    ,int        -- statemask
)
returns table
(
    submissionid int
    ,galleryid int
    ,gallerytitle varchar(100)
    ,createdby int
    ,createdbyname varchar(32)
    ,alteredby int
    ,alteredbyname varchar(32)
    ,createdon timestamp
    ,alteredon timestamp
    ,title varchar(100)
    ,content text
    ,file1 varchar(64)
    ,viewcount int
    ,mlevel int
    ,typecode int
    ,statecode int
)
as
$$
declare
    _submissionid   alias for $1;
    _upcount        alias for $2;
    _mmask          alias for $3;
    _statemask      alias for $4;
begin
    -- because the member may not want to see specific content (mmask)
    -- and because the submitter my have not published the content (statemask),
    -- include mmask and statemask in the where clause

    -- referenced this for aliases in an update
    -- http://stackoverflow.com/questions/11369757/postgres-wont-accept-table-alias-before-column-name
    if _upcount = true then
        update submission us set 
            viewcount = viewcount + 1 
        where us.submissionid = _submissionid 
            and (us.mlevel & _mmask) = us.mlevel
            and (us.statecode & _statemask) = us.statecode;
    end if;

    return query
    select
        s1.submissionid
        ,s1.galleryid
        ,coalesce(g1.title, 'Orphan')::varchar(100) as gallerytitle
        ,s1.createdby
        ,m1.accountname
        ,s1.alteredby
        ,m2.accountname
        ,s1.createdon
        ,s1.alteredon
        ,s1.title
        ,s1.content
        ,s1.file1
        ,s1.viewcount
        ,s1.mlevel
        ,s1.typecode
        ,s1.statecode
    from submission s1
    left join gallery g1 on s1.galleryid = g1.galleryid
    join member m1 on s1.createdby = m1.memberid
    join member m2 on s1.alteredby = m2.memberid
    where s1.submissionid = _submissionid
            and (s1.mlevel & _mmask) = s1.mlevel
            and (s1.statecode & _statemask) = s1.statecode;
end;
$$
language plpgsql;

最佳答案

您不能对要更新的列进行表限定,但您可以(并且必须,在这种情况下)对所用表达式中的列进行表限定:

SET  viewcount = us.viewcount + 1

顺便说一句,在 Postgres 8.0 或更高版本中,您可以(并且应该)使用参数名称而不是别名:

CREATE OR REPLACE FUNCTION submission_getone (
  _submissionid int
 ,_upcount boolean
 ,_mmask int
 ,_statemask int
)

...并摆脱这个:

<strike>declare
    _submissionid   alias for $1;
    _upcount        alias for $2;
    _mmask          alias for $3;
    _statemask      alias for $4;</strike>

RETURNS TABLE 表示您至少拥有 Postgres 8.4。

关于带有导致歧义的更新和选择语句的 PostgreSQL 返回表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16258549/

相关文章:

MySql XOR 更新 - 比较行并更新值

database - 在 PostgreSQL 中禁用自动提交以创建触发器

postgresql - 在 PostgreSQL 中将字符串散列为数值

postgresql - 记录 "new"尚未分配

postgresql - 创建多个部分索引,只扫描一次(Postgresql)?

oracle - 如何将几何字段从 postgresql(PostGIS) 迁移到 sdo 几何字段 oracle

postgresql - 有什么方法可以根据数据值创建参照完整性?

python - 为 Django 模型 FloatField 设置最大默认值

sql - 使用同一表中的值更新行

sql - Oracle 中的动态更新查询