从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的过程/触发语言都有很大的不同。因此,您可能需要大量阅读手册,并进行大量测试。