最近,在支持业务从Oracle迁移到lightdb中发现merge into的不兼容:业务中merge语法中有`insert(table.column)`用表前缀
的SQL, 但在lightdb 的`merge`操作中却不被支持。所以新版的lightdb支持了该功能。
Merge语句简介
在开始介绍`insert(table.column)`在`merge`语句中的支持之前,让我们先了解一下`merge`语句的基本概念。
`merge`语句是一种用于在目标表中执行插入、更新和删除操作的强大语句。它的语法通常是这样的:
MERGE INTO target_table USING source_table ON (condition) WHEN MATCHED THEN UPDATE SET column1 = value1, column2 = value2, ... WHEN NOT MATCHED THEN INSERT (column1, column2, ...) VALUES (value1, value2, ...);
在这个语句中,`target_table`是我们要操作的目标表,`source_table`则是我们的数据源。
根据`ON`后的条件,`merge`语句会执行相应的更新或插入操作。
Insert语句的表前缀问题
在数据库操作中,我们常常需要指定表的前缀,以区分不同的表。然而,我们发现`insert(table.column)`的语法
在`merge`语句中不被支持。 这是为什么呢?
这个现象的原因在于,`merge`操作中,更新插入的对象都是目标表,而`insert`语句本身并不支持
`insert into table(table.column)`这样的语法。 因此,在`merge` insert操作时,如果用户写了`insert(table.column)`这样的语法,就需要在语法转换中将其转换
为`insert(column)`。
用法示例:
MERGE INTO target t USING source AS s ON t.tid = s.sid WHEN NOT MATCHED THEN INSERT (t.tid, t.balance) VALUES (0, 0) ;