Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
比较函数中的postgresql枚举_Postgresql_Triggers - Fatal编程技术网

比较函数中的postgresql枚举

比较函数中的postgresql枚举,postgresql,triggers,Postgresql,Triggers,我定义了一个函数,我希望在它被修改时更新一个记录值 CREATE FUNCTION update_project_status_away_from_started() RETURNS TRIGGER AS $$ BEGIN IF OLD.status = 'started' THEN NEW.status = 'updating'; RETURN NEW; END IF; RETURN OLD; END; $$ language 'plpgsql'; 但是,当我更新行时

我定义了一个函数,我希望在它被修改时更新一个记录值

CREATE FUNCTION update_project_status_away_from_started()
RETURNS TRIGGER AS $$
BEGIN
  IF OLD.status = 'started' THEN
    NEW.status = 'updating';
    RETURN NEW;
  END IF;
RETURN OLD;
END;
$$ language 'plpgsql';
但是,当我更新行时,会出现以下错误:

ERROR: operator does not exist: projectstatus = character varying
枚举定义如下:

CREATE TYPE projectstatus AS ENUM ('started', 'updating', 'complete');
我的理解是,枚举被比作字符串,不知道该怎么做。不幸的是,我不知道如何将字符串“start”强制转换为枚举。网站上的postgresql页面对我帮助不大。有人知道吗?

Operator=用于比较。使用:=进行分配

比如:

  IF OLD.status = 'started' THEN
    NEW.status := 'updating';
    RETURN NEW;
  END IF;
运算符=用于比较。使用:=进行分配

比如:

  IF OLD.status = 'started' THEN
    NEW.status := 'updating';
    RETURN NEW;
  END IF;

博士后抱怨你需要投下:

IF OLD.status = 'started'::projectstatus THEN
  NEW.status := 'updating'::projectstatus;
  RETURN NEW;
END IF;

此外,正如Igor的回答中所指出的,最好使用:=进行分配,而不是传统的和不推荐的,但仍然是功能性的=分配运算符。

Postgres抱怨说,您需要转换:

IF OLD.status = 'started'::projectstatus THEN
  NEW.status := 'updating'::projectstatus;
  RETURN NEW;
END IF;

此外,正如Igor的回答中所指出的,最好使用:=for assignment,而不是遗留的和不推荐使用的,但仍具有功能性的=assignment操作符。

您知道吗,此触发器将以静默方式阻止对具有状态的行的所有更新!='开始“?+1@IgorRomanchenko所说的:返回旧的;将拒绝所有更新,并可能返回NEW;。您知道吗,此触发器将以静默方式阻止对具有状态的行的所有更新!='开始“?+1@IgorRomanchenko所说的:返回旧的;将拒绝所有更新,并可能返回NEW;。这个答案是错误的当plpgsql中没有歧义时,也适用于赋值。这是没有记录的,因为Postgres团队希望摆脱这种行为,但效果很好。这个答案是错误的当plpgsql中没有歧义时,也适用于赋值。这是没有文档记录的,因为Postgres团队希望消除这种行为,但它可以正常工作。很抱歉,最好使用:=用于作业…,官方文档对此没有任何说明,甚至可以使用-Equal=来代替PL/SQL兼容:=@AndriyLeshchuk:在变量赋值和相等性检查中不使用同一运算符的代码更容易阅读和维护。如果您有任何旧的Basic或Visual Basic代码,请尝试打开这些代码。很抱歉,最好使用:=进行分配…,官方文档对此没有任何说明,甚至可以使用-Equal=来代替PL/SQL兼容:=@AndriyLeshchuk:在变量赋值和相等性检查中不使用同一运算符的代码更容易阅读和维护。尝试打开一些旧的Basic或Visual Basic代码,如果您有这些代码的话。