首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MySQL在从DB2迁移时触发创建错误

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

Stack Overflow用户
提问于 2017-11-27 15:48:13
回答 1查看 320关注 0票数 2

我正在尝试将一些DB2查询转换为MySQL。我试图找到一些工具来转换转换。不幸的是,我没有找到任何转换工具和一些在线工具没有正确地转换。因此,我尝试自己将DB2查询转换为MySQL。

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

触发器1 :

代码语言:javascript
复制
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; 

这里我看到语法错误

代码语言:javascript
复制
right syntax to use near 'VALUE FOR REVISION));
  END' at line 9

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

问题1 :

它有NEXT VALUE FOR替代MySQL吗?

In触发器2,我正在做

代码语言:javascript
复制
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;

并得到错误:

代码语言:javascript
复制
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. 我可以在AFTER UPDATE OF中使用MySQL列吗?以及FOR d AS第4行和BEGIN ATOMIC第3行的任何错误。
  2. 如果我使用了多列值,如

扳机:

代码语言:javascript
复制
  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;

我如何处理这个问题?我应该这样用吗?

代码语言:javascript
复制
IF NEW.a <> OLD.a or NEW.b <> OLD.b ?

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

更新:

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

代码语言:javascript
复制
  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;
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-11-27 16:23:53

序列

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

通过创建单个表来模拟序列有一个尴尬的解决方法,每次需要新值时都会增加该表。

代码语言:javascript
复制
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>时,您都会重复前面的两个步骤。last_insert_id()函数在MySQL中或多或少类似于DB2的IDENTITY_VAL_LOCAL()。在这里读取last_insert_id()函数的完整文档:last-insert-id

列触发器

MySQL触发器声明语法类似于

代码语言:javascript
复制
CREATE TRIGGER SAMPLE_TRIGGER AFTER UPDATE ON SETTINGS
FOR EACH ROW ...

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

循环

FOR d AS SELECT ...循环结构不受MySQL支持。如果需要执行循环,则需要了解游标语法。参见https://dev.mysql.com/doc/refman/5.7/en/cursors.html中的示例

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47514817

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档