当我尝试创建触发器时 PostgreSQL 出现语法错误

2023-12-02

我想在 PostgreSQL 中创建触发器。

逻辑很简单。

我需要触发器,如果​​published_at更新并且writing_at为空,则将published_at设置为writing_at。

我写了这个,但失败了。有人有想法吗?

CREATE function setWrittenAt() RETURNS trigger;
AS 
DECLARE old_id INTEGER;
BEGIN ;
old_id = OLD.id
  IF NEW.published_at IS NOT and NEW.written_at IS null
    THEN
    UPDATE review SET NEW.written_at = NEW.published_at where id = old_id;
 END IF ;
RETURN NEW;
END;
LANGUAGE plpgsql;


CREATE TRIGGER update_written_at 
    AFTER UPDATE OF published_at ON review
    WHEN (OLD.published_at IS DISTINCT FROM NEW.published_at)
    EXECUTE PROCEDURE setWrittenAt();

Error:

语法错误:7 错误:“DECLARE”处或附近的语法错误 第 3 行:声明 old_id INTEGER;


您的代码中有多个错误:

  • IS NOT不是您需要的有效表达式IS NOT NULL.
  • After BEGINreturns条款必须没有;
  • 您忘记将函数体作为字符串括起来(如果使用则更容易编写美元报价
  • 你也不需要不必要的(额外的)UPDATE如果你把它做成before trigger
CREATE function setwrittenat() 
  RETURNS trigger
AS 
$$
BEGIN
  IF NEW.published_at IS NOT NULL and NEW.written_at IS null THEN
    NEW.written_at := = NEW.published_at; --<< simply assign the value
  END IF;
  RETURN NEW;
END;
$$
LANGUAGE plpgsql;

然后使用一个BEFORE扳机:

CREATE TRIGGER update_written_at 
    BEFORE UPDATE OF published_at ON review
    WHEN (OLD.published_at IS DISTINCT FROM NEW.published_at)
    FOR EACH ROW
    EXECUTE PROCEDURE setWrittenAt();
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

当我尝试创建触发器时 PostgreSQL 出现语法错误 的相关文章

随机推荐

  • 如何使用 dataType: 'jsonp' 但 Accept 标头中仍然有 application/json ?

    我想访问另一个域上的 REST 服务 如果在 JQuery 中我指定 dataType json 正如预期的那样 它失败了 因为对于跨域调用 必须使用 JSONP 当我将其更改为 dataType jsonp 它预计可以工作 但由于服务器期
  • 在应用程序更新中播放 Core,在生产版本上提供 UPDATE_NOT_AVAILABLE

    我已经集成了 Play 核心应用内更新 它在测试轨道中运行良好 但是当在生产轨道中发布版本时 它总是给出 UPDATE NOT AVAILABLE 标志 我认为问题可能是因为启用了定时发布 发布概述 是否有任何修复或任何设置需要我从游戏控制
  • ICMP 回显数据包的最大合法大小

    有人可以解释一下为什么 ICMP 回显数据包的最大合法大小计算如下 65535 20 8 65507 Thanks 65535 字节是 IPv4 网络数据包允许的最大大小 而 20 和 8 是 IP 和 ICMP 标头的大小 最多为 ICM
  • python 行编辑 telnet 服务器

    我正在用 python 创建一个服务器 它所做的事情无关紧要 但我希望它接受 telnet 连接并提供具有行编辑功能 tabcompletion emacs vi mode 等 和每个会话的历史记录的命令行界面 我已成功创建 telnet
  • 如何在java中获取命令提示符输出?

    如何获取命令提示符的输出 这意味着我已经打开了这样的命令提示符 Process process Runtime getRuntime exec cmd c start cmd exe K C Editor editorTemp exe 我无
  • 在解析 XML 时保留 CDATA 部分

    我正在尝试将现有的 Xml 文件转换为另一个 xml 文件 并添加一些节点 但是当我解析原始 xml 文件并将其写入另一个 xml 文件时 它会删除所有CDATA来自输出 xml 我怎样才能避免它 这是我的代码 tree ET parse
  • C# Webforms 在代码执行期间显示加载指示器 [关闭]

    Closed 这个问题需要多问focused 目前不接受答案 我的 Webforms 应用程序数据量很大 主要是执行 ADO net 操作的 ASP 控件 我的加载时间为 5 15 秒 这是正常的 但我想让用户更明显地知道他们的请求正在处理
  • 如何循环遍历js对象中的项目?

    我怎样才能循环浏览这些项目 var userCache userCache john ID 234 name john userCache mary ID 567 name mary userCache douglas ID 42 name
  • random.choice() 有两个参数? [复制]

    这个问题在这里已经有答案了 我在以下掷骰子函数中犯了一个简单的错误 import random def rollDie return random choice 1 2 3 4 5 6 print rollDie 我确实知道我需要将序列作为
  • 如何在 Dart 中编码为 UTF16 Little Endian?

    我正在尝试使用 Dart 来操作程序使用的一些系统变量 我遇到过这样的问题飞镖的utf软件包已停产 并且我还没有找到任何方法来编码为 UTF 16 Little EndianFile 写 Dart 中是否有可以进行字节到 UTF 16 LE
  • 较新的 JRE 版本可以运行使用较旧的 JDK 版本编译的 Java 程序吗?

    运行用 Java 版本 1 6 编译的 Java 程序和相关库时我会遇到任何问题吗 and1 7 我使用 1 7 进行编译 而某些库是使用 1 6 进行编译 并在 1 7 JRE 中运行整个程序 As answered already yo
  • OpenGL 纹理映射顽固地拒绝工作

    我正在用 D 编程语言使用 SDL 和 OpenGL 编写 2D 游戏 目前它只是尝试将纹理映射的四边形渲染到屏幕上 问题是 整个纹理映射部分似乎不太工作 尽管纹理显然加载得很好 分配了一个非零纹理编号 不会导致 glGetError 返回
  • 这里如何使用不完整的类型作为向量的模板参数?

    直到以下程序是合法的以及诸如此类的 include
  • Excel 中的随机数数组

    如何使用以下命令创建随机数数组RAND or RANDBETWEEN功能 我正在尝试用一个公式模拟 10 卷六面骰子 例如 的平均结果 我过去曾尝试过以下方法 但它只创建一个随机数并重复它 SUMPRODUCT ROW A1 A10 0 I
  • 基于 SQL 集的范围

    如何让 SQL 在不循环的情况下重复某些基于集合的操作任意次数 如何让 SQL 对一系列数字执行操作 我基本上是在寻找一种方法来执行基于集合的 for 循环 我知道我可以创建一个包含整数的小表 例如从 1 到 1000 然后将其用于该范围内
  • 如何在使用集合时将项目添加到集合中?

    下面的示例抛出 InvalidOperationException 集合已修改 枚举操作可能无法执行 执行代码时 var urls new List
  • Android WebView在查看html嵌套列表时加载空白

    我正在尝试使用 Android 将大小合理的 html 嵌套列表加载到 WebView 中 问题是当我尝试加载 html 时 它看起来是空白的 现在我已经尝试了几种不同的方法 我首先尝试了 W3Schools Try It Yourself
  • 是否可以在变量中获取 Phalcon\Mvc\View 渲染输出?

    我需要返回 json 对象 该对象具有带有渲染操作的属性 html 是否可以使用 Phalcon vew 进行本地操作 Example posts NewsPost find limit gt 10 view new Phalcon Mvc
  • ImportError:pyInstaller 之后没有名为“tkinter”的模块

    我想做一个可执行文件 但每次运行 exe 时它都会写入ImportError No module named tkinter 以及我在 Stack Overflow 上读到的所有内容都对我没有帮助 我的 python 程序很简单 ODE 求
  • 当我尝试创建触发器时 PostgreSQL 出现语法错误

    我想在 PostgreSQL 中创建触发器 逻辑很简单 我需要触发器 如果 published at更新并且writing at为空 则将published at设置为writing at 我写了这个 但失败了 有人有想法吗 CREATE