mysql中merge的用法,原来sql还可以这样写,真方便……(还有merge的用法)

DML(改变数据结构)

insert语句

表间数据拷贝:

insert into dept1(id,name) select(deptno,dname) from

dept;

update

语句:

将编号为7779用户的工作换成7566的雇员的工作和所属上级。

update

myemp set(job,mgr) = (select job,mgr from myemp where empno=7566)

where empno=7779

如果子查询中返回的是空,则目标字段也更新成null

merge语句:

merge语句是sql语句的一种。在sql

server、Oracle数据库中可用,mysql、PostgreSql中不可用。merger是oracle新增的语法,用来合并update和insert语句。通过merge语句,根据一张表(原数据表)或子查询的连接条件对另一张(目标表)表进行查询,连接条件匹配是上的进行update,无法匹配的执行insert。这个语法仅需一次全表扫描就完成了全部工作,执行效率高于insert+update。

具体来说,merge语句会检查原数据表记录和目标表记录。如果记录在原数据表和目标数据表中均存在,则目标表中的记录将被原数据表中的记录所更新(执行update操作);如果目标表中不存在的某些记录,在原数据表中存在,则原数据表的这些记录将被插入到目标表中(执行insert操作)。

Example

Select

trunc(sysdate,'d') From dual

Create Table test1(eid Number(10),Name Varchar2(20),birth

Date,salary Number(8,2));

-----------------------

Insert Into test1 Values(1001,'李四','16-4月-70',2300);

Insert Into test1 Values(1002,'张三','20-5月-73',6600);

Create Table test2(eid Number(10),Name Varchar2(20),birth

Date,salsry Number(8,2));

---------------------

Merge Into test2

Using test1

On(test1.eid=test2.eid)

When Matched Then

Update Set

Name=test1.name,birth=test1.birth,salsry=test1.salary

When Not Matched Then

Insert

(eid,Name,birth,salsry)Values(test1.eid,test1.name,test1.birth,test1.salary)

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
出现该问题可能是因为 MyBatis 对于 MySQLMerge 语法的支持不太好。你可以尝试在 MyBatis 的配置文件加入下面的配置: ```xml <settings> <setting name="useGeneratedKeys" value="true"/> <setting name="useColumnLabel" value="true"/> <setting name="mapUnderscoreToCamelCase" value="true"/> <setting name="autoMappingBehavior" value="PARTIAL"/> <setting name="defaultExecutorType" value="SIMPLE"/> <setting name="jdbcTypeForNull" value="OTHER"/> <setting name="safeRowBoundsEnabled" value="false"/> <setting name="aggressiveLazyLoading" value="false"/> <setting name="multipleResultSetsEnabled" value="true"/> <setting name="useCacheStatements" value="true"/> <setting name="cacheEnabled" value="true"/> <setting name="defaultStatementTimeout" value="25000"/> <setting name="defaultFetchSize" value="100"/> <setting name="lazyLoadingEnabled" value="false"/> <setting name="callSettersOnNulls" value="false"/> <setting name="logImpl" value="LOG4J"/> <setting name="configurationFactory" value="com.xxx.xxx.MybatisConfigurationFactory"/> <setting name="defaultScriptingLanguage" value="com.xxx.xxx.CustomLanguageDriver"/> </settings> ``` 其,`CustomLanguageDriver` 是自定义的 MyBatis 语言驱动,可以通过继承 `XMLLanguageDriver` 实现。在自定义的语言驱动,你可以重 `merge()` 方法来实现 MySQLMerge 语法。 另外,你还需要在 pom.xml 文件添加以下依赖: ```xml <dependency> <groupId>com.alibaba</groupId> <artifactId>druid</artifactId> <version>1.1.10</version> </dependency> ``` 这是集成了 Druid 连接池的依赖。你需要在 MyBatis 的配置文件配置 Druid 连接池。例如: ```xml <dataSource type="com.alibaba.druid.pool.DruidDataSource"> <property name="driverClassName" value="com.mysql.jdbc.Driver"/> <property name="url" value="jdbc:mysql://localhost:3306/test"/> <property name="username" value="root"/> <property name="password" value="root"/> <property name="maxActive" value="20"/> <property name="initialSize" value="1"/> <property name="maxWait" value="60000"/> <property name="minIdle" value="1"/> <property name="validationQuery" value="SELECT 1 FROM DUAL"/> <property name="testOnBorrow" value="false"/> <property name="testOnReturn" value="false"/> <property name="testWhileIdle" value="true"/> <property name="timeBetweenEvictionRunsMillis" value="60000"/> <property name="minEvictableIdleTimeMillis" value="25200000"/> <property name="filters" value="stat,wall"/> <property name="connectionProperties" value="druid.stat.mergeSql=true"/> </dataSource> ``` 注意,最后一行的 `druid.stat.mergeSql=true` 是用来开启 Druid 的 Merge SQL 统计功能的。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值