草庐IT

mysql - 将 MySQL 触发器重写为 Postgres

coder 2023-10-24 原文

伙计们!

我在 MySQL 数据库中有一个触发器:

CREATE DEFINER="root"@"127.0.0.1" TRIGGER `tai_actions_for_active_count` AFTER INSERT ON `actions` FOR EACH ROW BEGIN
  DECLARE l_isnn TINYTEXT;
  IF NEW.action_type IN ('CREATION', 'VERIFICATION', 'CLOSE') THEN

    SET l_isnn = IF(NEW.isnn is NULL, '*', NEW.isnn);
    IF NOT NEW.action_type = 'CLOSE' THEN
      INSERT INTO subscriptions.`statistics_active_count`(`service_id`, `operator_id`, `isnn`, `active_count`)
        VALUES (NEW.service_id, NEW.operator_id, l_isnn, 1)
        ON DUPLICATE KEY UPDATE active_count = active_count + 1;
    ELSE
      SET @tai_actions_for_active_count = -1;
      UPDATE subscriptions.`statistics_active_count` SET active_count = @tai_actions_for_active_count := active_count - 1
        WHERE `service_id` = NEW.service_id AND `operator_id` = NEW.operator_id AND `isnn` = l_isnn;
      IF @tai_actions_for_active_count = 0 THEN DELETE FROM subscriptions.`statistics_active_count` WHERE `active_count` = 0; END IF;
    END IF;
  END IF;
END

所以我需要重写它以使其在 Postgres 数据库中工作。因为有 ON DUPLICATE KEY UPDATE 我正在使用带有 UPSERT (ON CONFLICT (KEY) DO UPDATE) 的 Postgres 9.5 版。

所以我对 SQL 语言知之甚少,你能告诉我我做错了什么吗?有 Postgres PL 代码:

  DECLARE
    l_isnn TEXT;
    tai_actions_for_active_count INTEGER;
  BEGIN
    IF NEW.action_type IN ('CREATION', 'VERIFICATION', 'CLOSE') THEN
        IF NEW.isnn is NULL THEN
            l_isnn := '*';
        ELSE
            l_isnn := NEW.isnn;
        END IF;
        IF NOT NEW.action_type = 'CLOSE' THEN
            INSERT INTO "subscriptions.statistics_active_count"(service_id, operator_id, isnn, active_count)
                VALUES (NEW.service_id, NEW.operator_id, l_isnn, 1)
                ON CONFLICT(active_count) DO UPDATE SET active_count = active_count + 1;
        ELSE
            tai_actions_for_active_count := -1;
            UPDATE "subscriptions.statistics_active_count" SET active_count = active_count - 1
        -- (tai_actions_for_active_count := active_count - 1)
                WHERE service_id = NEW.service_id AND operator_id = NEW.operator_id AND isnn = l_isnn;
            UPDATE "subscriptions.statistics_active_count" SET tai_actions_for_active_count = active_count
                WHERE service_id = NEW.service_id AND operator_id = NEW.operator_id AND isnn = l_isnn;
            IF tai_actions_for_active_count = 0 THEN DELETE FROM "subscriptions.statistics_active_count" WHERE active_count = 0; END IF;
        END IF;
    END IF;
    RETURN NULL;
  END;

因为我想测试这个触发器,所以我收到一个错误 -- relation "subscriptions.statistics_active_count"does not exist

你能帮我处理那个代码吗?

最佳答案

我终于找到了解决方案。我猜:)

BEGIN
   IF NEW.action_type IN ('CREATION', 'VERIFICATION', 'CLOSE') THEN
      IF NEW.isnn IS NULL THEN
         l_isnn := '*';
      ELSE
         l_isnn := NEW.isnn;
      END IF;
      IF NOT NEW.action_type = 'CLOSE' THEN
         BEGIN
            INSERT INTO subscriptions.statistics_active_count (service_id, operator_id, isnn, active_count)
            VALUES (NEW.service_id, NEW.operator_id, l_isnn, 1);
         EXCEPTION WHEN unique_violation THEN
            UPDATE subscriptions.statistics_active_count  SET active_count = active_count + 1
            WHERE service_id = NEW.service_id and operator_id=NEW.operator_id;
         END;
      ELSE
         tai_actions_for_active_count := -1;
         WITH upd AS
         (UPDATE subscriptions.statistics_active_count
         SET active_count = active_count - 1
         WHERE service_id = NEW.service_id AND operator_id = NEW.operator_id AND isnn = l_isnn;
         RETURNING active_count)
         SELECT *
         FROM upd INTO tai_actions_for_active_count;
         IF tai_actions_for_active_count = 0 THEN
            DELETE FROM public.statistics_active_count
            WHERE active_count = 0;
         END IF;
      END IF;
   END IF;
END;

关于mysql - 将 MySQL 触发器重写为 Postgres,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31920117/

有关mysql - 将 MySQL 触发器重写为 Postgres的更多相关文章

  1. ruby - 在 64 位 Snow Leopard 上使用 rvm、postgres 9.0、ruby 1.9.2-p136 安装 pg gem 时出现问题 - 2

    我想为Heroku构建一个Rails3应用程序。他们使用Postgres作为他们的数据库,所以我通过MacPorts安装了postgres9.0。现在我需要一个postgresgem并且共识是出于性能原因你想要pggem。但是我对我得到的错误感到非常困惑当我尝试在rvm下通过geminstall安装pg时。我已经非常明确地指定了所有postgres目录的位置可以找到但仍然无法完成安装:$envARCHFLAGS='-archx86_64'geminstallpg--\--with-pg-config=/opt/local/var/db/postgresql90/defaultdb/po

  2. ruby - 触发器 ruby​​ 中 3 点范围运算符和 2 点范围运算符的区别 - 2

    请帮助我理解范围运算符...和..之间的区别,作为Ruby中使用的“触发器”。这是PragmaticProgrammersguidetoRuby中的一个示例:a=(11..20).collect{|i|(i%4==0)..(i%3==0)?i:nil}返回:[nil,12,nil,nil,nil,16,17,18,nil,20]还有:a=(11..20).collect{|i|(i%4==0)...(i%3==0)?i:nil}返回:[nil,12,13,14,15,16,17,18,nil,20] 最佳答案 触发器(又名f/f)是

  3. ruby-on-rails - Rails - 乐观锁定总是触发 StaleObjectError 异常 - 2

    我正在学习Rails,并阅读了关于乐观锁的内容。我已将类型为integer的lock_version列添加到我的articles表中。但现在每当我第一次尝试更新记录时,我都会收到StaleObjectError异常。这是我的迁移:classAddLockVersionToArticle当我尝试通过Rails控制台更新文章时:article=Article.first=>#我这样做:article.title="newtitle"article.save我明白了:(0.3ms)begintransaction(0.3ms)UPDATE"articles"SET"title"='dwdwd

  4. ruby-on-rails - 如何在 Rails Controller Action 上触发 Facebook 像素 - 2

    我有一个ruby​​onrails应用程序。我按照facebook的说明添加了一个像素。但是,要跟踪转化,Facebook要求您将页面置于达到预期结果时出现的转化中。即,如果我想显示客户已注册,我会将您注册后转到的页面作为成功对象进行跟踪。我的问题是,当客户注册时,在我的应用程序中没有登陆页面。该应用程序将用户带回主页。它在主页上显示了一条消息,所以我想看看是否有一种方法可以跟踪来自Controller操作而不是实际页面的转化。我需要计数的Action没有页面,它们是ControllerAction。是否有任何人都知道的关于如何执行此操作的gem、文档或最佳实践?这是进入布局文件的像素

  5. 使用canal同步MySQL数据到ES - 2

    文章目录一、概述简介原理模块二、配置Mysql使用版本环境要求1.操作系统2.mysql要求三、配置canal-server离线下载在线下载上传解压修改配置单机配置集群配置分库分表配置1.修改全局配置2.实例配置垂直分库水平分库3.修改group-instance.xml4.启动监听四、配置canal-adapter1修改启动配置2配置映射文件3启动ES数据同步查询所有订阅同步数据同步开关启动4.验证五、配置canal-admin一、概述简介canal是Alibaba旗下的一款开源项目,Java开发。基于数据库增量日志解析,提供增量数据订阅&消费。Git地址:https://github.co

  6. ruby - 使用 postgres.app 在 rvm 下要求 pg 时出错 - 2

    我正在使用Postgres.app在OSX(10.8.3)上。我已经修改了我的PATH,以便应用程序的bin文件夹位于所有其他文件夹之前。Rammy:~phrogz$whichpg_config/Applications/Postgres.app/Contents/MacOS/bin/pg_config我已经安装了rvm并且可以毫无错误地安装pggem,但是当我需要它时我得到一个错误:Rammy:~phrogz$gem-v1.8.25Rammy:~phrogz$geminstallpgFetching:pg-0.15.1.gem(100%)Buildingnativeextension

  7. ruby - 导轨 4 : column reference "updated_at" is ambiguous with Postgres - 2

    我正在尝试使用“updated_at”字段的日期时间范围查询数据库。前端在JSON数组中发送查询:["2015-09-0100:00:00","2015-10-0223:00:00"]在RailsController中,我使用以下方法将两个字符串解析为DateTime:start_date=DateTime.parse(params[:date_range_arr][0])end_date=DateTime.parse(params[:date_range_arr][1])#...@events=@events.where('updated_atBETWEEN?AND?,start_d

  8. ruby-on-rails - 无法安装 mysql2 0.3.14 gem - 2

    我看到其他人也遇到过类似的问题,但没有一个解决方案对我有用。0.3.14gem与其他gem文件一起存在。我已经完全按照此处指示完成了所有操作:https://github.com/brianmario/mysql2.我仍然得到以下信息。我不知道为什么安装程序指示它找不到include目录,因为我已经检查过它存在。thread.h文件存在,但不在ruby​​目录中。相反,它在这里:C:\RailsInstaller\DevKit\lib\perl5\5.8\msys\CORE\我正在运行Windows7并尝试在Aptana3中构建我的Rails项目。我的Ruby是1.9.3。$gemin

  9. ruby - Faye WebSocket,关闭处理程序被触发后重新连接到套接字 - 2

    我有一个super简单的脚本,它几乎包含了FayeWebSocketGitHub页面上用于处理关闭连接的内容:ws=Faye::WebSocket::Client.new(url,nil,:headers=>headers)ws.on:opendo|event|p[:open]#sendpingcommand#sendtestcommand#ws.send({command:'test'}.to_json)endws.on:messagedo|event|#hereistheentrypointfordatacomingfromtheserver.pJSON.parse(event.d

  10. ruby - 如何使用 ruby​​ mysql2 执行事务 - 2

    我已经开始使用mysql2gem。我试图弄清楚一些基本的事情——其中之一是如何明确地执行事务(对于批处理操作,比如多个INSERT/UPDATE查询)。在旧的ruby-mysql中,这是我的方法:client=Mysql.real_connect(...)inserts=["INSERTINTO...","UPDATE..WHEREid=..",#etc]client.autocommit(false)inserts.eachdo|ins|beginclient.query(ins)rescue#handleerrorsorabortentirelyendendclient.commi

随机推荐