我正在尝试将一些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 :
它有NEXT VALUE FOR替代MySQL吗?
In触发器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 :
AFTER UPDATE OF中使用MySQL列吗?以及FOR d AS第4行和BEGIN ATOMIC第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 ?我是这方面的初学者,我想帮助迁移。我知道这些都是语法问题而不是有效的问题。请提供帮助或建议。
更新:
我试过了last_insert_id和CURSOR。这就是现在的工作代码:
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;发布于 2017-11-27 16:23:53
序列
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>时,您都会重复前面的两个步骤。last_insert_id()函数在MySQL中或多或少类似于DB2的IDENTITY_VAL_LOCAL()。在这里读取last_insert_id()函数的完整文档:last-insert-id
列触发器
MySQL触发器声明语法类似于
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中的示例
https://stackoverflow.com/questions/47514817
复制相似问题