Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/36.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
从DB2迁移时MySQL触发器创建错误_Mysql_Sql_Database_Triggers - Fatal编程技术网

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

从DB2迁移时MySQL触发器创建错误,mysql,sql,database,triggers,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

我正在尝试将一些
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
我认为问题是由于的下一个值引起的

问题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; 
MySQL的替代方案是否有下一个值

在触发器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
我认为问题是
在更新了带有列的
之后,我怀疑d的
是第4行和
开始原子的

问题2:

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; 
  • 在MySQL中更新
  • 后,我可以使用列吗?还有什么错误吗 在d的
    中作为
    第4行和
    开始原子
    第3行
    
  • 如果我使用了多个列值,例如
  • 触发:

      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 ?
    
    序列 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 |
    +------------------+
    
    但每次使用
    的下一个值时,都会重复上面的最后两个步骤。MySQL中的最后一个函数insert\u id()或多或少类似于DB2的
    IDENTITY\u VAL\u LOCAL()
    。请在此处阅读上一个函数的完整文档插入id()

    列触发器 MySQL触发器声明语法如下

    CREATE TRIGGER SAMPLE_TRIGGER AFTER UPDATE ON SETTINGS
    FOR EACH ROW ...
    
    MySQL不支持“OF”子句。这在DB2中用于在更新特定列时触发,但MySQL不支持在特定列上触发

    循环
    MySQL不支持d AS SELECT…
    循环构造的
    。如果需要执行循环,则需要了解游标语法。请参见修订版下一个值中的示例

    看起来它可以用[表]中的
    选择最大值(修订版)+1替换。
    谢谢。我现在就试试。对其他问题有什么建议吗?仅供参考:我正在使用MySQL 5.7,感谢您提供宝贵的信息。我有一个问题。如果MySQL不支持特定列上的触发器,我如何编写该功能?是否有其他方法可以实现该功能?我还可以使用触发器中的列条件来实现该功能,如
    如果是NEW.column1 OLD.column1那么
    ?如果任何列发生更改,触发器将在更新时触发(如省略
    on
    子句,则会触发DB2触发器)。因此,是的,您必须在触发器正文中添加
    IF/THEN
    语句。感谢您提供宝贵的建议和时间。我将处理
    IF/THEN
    语句。在任意两个RDBMS产品之间进行移植必然是一个漫长而复杂的过程。尽管SQL是行业标准,但每个实现都添加了许多自己的自定义特性和扩展。特别是,每个RDBMS的过程/触发语言都有很大的不同。因此,您可能需要大量阅读手册,并进行大量测试。