我正在尝试将一些 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:
- 我可以在 MySQL 中对列使用
AFTER UPDATE OF
吗?和任何错误 在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;
最佳答案
序列
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/