从 DB2 迁移时 MySQL 触发器创建错误

标签 mysql sql database triggers

我正在尝试将一些 DB2 查询转换为 MySQL 。我试图找到一些工具来转换转换。不幸的是,我没有找到任何转换工具,而且一些在线工具无法正确转换。所以我尝试自己将 DB2 查询转换为 MySQL。

我已经开始在 MySQL 中创建 3 个触发器查询。不幸的是我遇到了一些语法错误。这些是我从 DB2 迁移到 MySQL 时的以下查询。

触发器 1:

CREATE TRIGGER SAMPLE_TABLE3 AFTER INSERT ON SAMPLE_TABLE4
  FOR EACH ROW
  BEGIN
      INSERT INTO LICENSE_REVISION(LICENSE, LICENSE_REV) VALUES (NEW.ID, (NEXT VALUE FOR REVISION));
  END; 

语法错误

right syntax to use near 'VALUE FOR REVISION));
  END' at line 9

我认为问题是由于 NEXT VALUE FOR 造成的。

问题 1:

它是 MySQL 的任何 NEXT VALUE FOR 替代品吗?

在触发器 2 中,我正在做

CREATE TRIGGER SAMPLE_TRIGGER AFTER UPDATE OF SUPPORT__SERVER_UPS ON SETTINGS
  FOR EACH ROW
  BEGIN ATOMIC
    FOR d AS SELECT ID AS D_ID FROM DOMAIN
    DO UPDATE DOMAIN_REVISION DR SET DR.SERVER_DOMAIN_REV = (NEXT VALUE FOR REVISION) WHERE DR.DOMAIN = D_ID;
    END FOR;
  END;

出现错误:

right syntax to use near 'OF SUPPORT__SERVER_UPS ON SETTINGS
  REFERENCING NEW AS NEW OLD AS OLD
  FOR EAC' at line 6

我认为问题出在列的 AFTER UPDATE OF 上,我怀疑 FOR d AS 第 4 行和 BEGIN ATOMIC 也是。

问题 2:

  1. 我可以在 MySQL 中对列使用 AFTER UPDATE OF 吗?和任何错误 在 FOR d AS 第 4 行和 BEGIN ATOMIC 第 3 行。
  2. 如果我使用了多个列值,例如

触发器:

  CREATE TRIGGER SAMPLE_4 AFTER UPDATE OF IPV4_FIRST, IPV4, IPV4_MASK, IPV6_FIRST, IPV6, IPV6_MASK ON VIRTUAL_NETWORK
          FOR EACH ROW
          BEGIN
          FOR d AS SELECT DOMAIN AS D_ID FROM DOMAIN_VIRTUAL_NETWORK WHERE VIRTUAL_NETWORK=NEW.ID
            DO UPDATE DOMAIN_REVISION DR SET DR.CLIENT_NETWORK_REV = (NEXT VALUE FOR REVISION) WHERE DR.DOMAIN = D_ID;
            END FOR;
          END;

我该如何解决这个问题?我应该这样使用吗

IF NEW.a <> OLD.a or NEW.b <> OLD.b ?

我是这方面的初学者,我想帮助迁移。我知道这些是语法问题而不是有效问题。请帮助或建议。

更新:

我试过 last_insert_idCURSOR 。这是现在的工作代码:

  CREATE TRIGGER SAMPLE_TRIGGER AFTER UPDATE ON SETTINGS
  FOR EACH ROW
  BEGIN
  DECLARE my_cursor CURSOR FOR  SELECT ID AS D_ID FROM DOMAIN;
  IF NEW.SUPPORT__SERVER_UPS <=> OLD.SUPPORT__SERVER_UPS THEN
  open my_cursor; 
  my_loop: loop
    FETCH my_cursor INTO D_ID;
    UPDATE DOMAIN_REVISION DR SET DR.SERVER_DOMAIN_REV = (last_insert_id()) WHERE DR.DOMAIN = D_ID;
    end loop my_loop; 
    close my_cursor;
   END IF;
  END;

最佳答案

序列

MySQL 没有序列对象。 NEXT VALUE FOR <sequence> MySQL 不支持。

有一个笨拙的解决方法来模拟序列,方法是创建一个单独的表,每次您需要一个新值时都会递增该表。

mysql> create table sequence (id int not null primary key );
mysql> insert into sequence values (0);
mysql> update sequence set id = last_insert_id(id+1);
mysql> select last_insert_id();
+------------------+
| last_insert_id() |
+------------------+
|                1 |
+------------------+

但每次你都会使用 NEXT VALUE FOR <sequence>你会重复上面的最后两个步骤。 MySQL 中的 last_insert_id() 函数或多或少类似于 DB2 的 IDENTITY_VAL_LOCAL()。 .在此处阅读有关 last_insert_id() 函数的完整文档:https://dev.mysql.com/doc/refman/5.7/en/information-functions.html#function_last-insert-id

列触发器

MySQL 触发器声明语法如下

CREATE TRIGGER SAMPLE_TRIGGER AFTER UPDATE ON SETTINGS
FOR EACH ROW ...

MySQL 不支持“OF”子句。这在 DB2 中用于触发特定列的更新,但 MySQL 不支持特定列的触发器。

循环

FOR d AS SELECT ... MySQL 不支持循环结构。如果你需要做一个循环,你需要了解 CURSOR 语法。请参阅 https://dev.mysql.com/doc/refman/5.7/en/cursors.html 中的示例

关于从 DB2 迁移时 MySQL 触发器创建错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47514817/

相关文章:

android - 将新项目插入 MySQL 后刷新 ListView

mysql - 黑洞引擎的创意用途

mysql - 最后一条记录的更新状态

不影响其他操作的MySql查询

sql - PostgreSQL 密码生成器

database - 为 PHPMyadmin DB 自动生成数据库图?

PHP - 实现主键 SQL

mysql - MySql 中的清除命令

SQL SUM() 函数忽略 WHERE 子句和 CASE 语句

php - 拉拉维尔 : Route not found error