精华内容
下载资源
问答
  • 数据库 update后where语句的IN、EXISTS的效率测试

    这几天写存储过程,有很多次需要先将大致符合条件的数据查出来,放到临时表中。再根临时表中的数据进行更新操作。

    期间用到了IN和EXISTS,想知道这两种匹配操作,哪个效率更高一些。

    下面两张图是用自己机器上的数据进行的测试:

    数据库类型:MySQL

    使用IN的时候,


    使用EXISTS


    两个放一块,


    一目了然~了然师兄


    注意哈,临时表的CUST_ID我加了索引,如果不加索引,会相当慢,慢到我连等都不想等了。就是说在不加索引的时候,我还没见过他执行完。。。

    创建表的时候可以选择引擎,不知道叫存储引擎还是数据库引擎还是数据库表引擎。

    反正如果存储在设置为存储在内存的话会更快。当时数据到30w的时候,提示内存不够用了。

    上网查了一下,可以修改MAX_HEAP_TABLE_SIZE,MAX_HEAP_TABLE_SIZE默认是16M,修改:

    SET MAX_HEAP_TABLE_SIZE = 1024 * 1024 * 100;      -- 这样内存就会调整为100M了

    这个值好像是在mysql的配置文件中设置的,如果在在SQL代码块中修改了,只有在重启MySQL后才会重置为原来配置的参数。

    所以,如果临时调整这个值,最好在用完之后手动重置为原来的值。



    好了,就是这些。

    PS:写SQL的时候用大写感觉很吊!

    展开全文
  • accessupdate语句不能有子查询的,如不允许如下语句出现: UPDATE tblA SET lngID= (SELECT lngID FROM tblB WHERE strName=nihao)这样就需要另想办法解决问题。 解决方案:A。可以用update另外的语法解决...

    在access中,update语句不能有子查询的,如不允许如下语句出现:

     

    UPDATE tblA SET lngID=
          (
    SELECT lngID FROM tblB WHERE strName='nihao')

    这样就需要另想办法解决问题。

     

    解决方案:

    A。

    可以用update另外的语法解决:

    UPDATE Tab1 a,(Select ID,Name From Tab2) b
    SET a.Name = b.Name
    WHERE a.ID = b.ID;

     

    另外,像统计类的子查询还有一个方法,就是用到access特有的统计函数dsum,它的语法如下:

    DSum 函数

    DSum 函数可用于计算一组指定记录()中的一组值的总和。可以在 Visual Basic、、查询表达式或计算控件 中使用 DSum 函数。

    例如,可以在查询的计算字段表达式中通过 DSum 函数来计算某一段时间内特定雇员的总销售量。或者在计算控件中使用 DSum 函数来显示特定产品的流水销售总额。

    DSum(expr, domain, [criteria])

    DSum 函数包含以下参数:

     

    参数说明
    expr表达式,用于标识被计算值的总和的数字字段。它可以是标识表或查询中的字段的字符串表达式,或者是对该字段中的数据进行计算的表达式。在 expr 中,可以包含表中的字段、窗体上的控件、常量或者函数的名称。如果 expr 包含函数,那么该函数可以是内置的或用户定义的,但不能是其他域聚合函数或 SQL 聚合函数。
    domain字符串表达式,用于标识组成域的一组记录。它可以是不需要参数的查询的表名或查询名。
    criteria可选的字符串表达式,用于约束对其执行 DSum 函数的数据的范围。例如,criteria 常常等价于 SQL 表达式中除去 WHERE 关键字的 WHERE 子句。如果 criteria 被忽略,DSum 函数将对整个域计算 expr。任何包含在 criteria 中的字段必须也是 domain 中的字段;否则 DSum 函数将返回 Null 值。

     

    说明

    如果没有记录满足 criteria 参数或者域中不包含记录,那么 DSum 函数会返回 Null 值。

    不论是否在宏、模块、查询表达式或计算控件中使用 DSum 函数,都必须仔细构造 criteria 参数,以确保它将被正确计算。

    可以使用 DSum 函数来指定这些情况下的条件:在查询的条件行中,在查询表达式内的计算字段中,或者在更新查询的“更新到”行中。

    注释  可以将 DSumSum 函数用于总计查询中的计算字段表达式。如果使用 DSum 函数,将在数据分组之前计算值。如果使用 Sum 函数,则先进行数据分组,然后再计算字段表达式中的值。

    需要显示不在窗体或报表的记录源中的字段的一组值的总和时,可以使用 DSum 函数。例如,假定有一个显示特定产品信息的窗体。可以在计算控件中使用 DSum 函数来随时统计产品的流水销售总额。

     

    注释  使用这些函数时,对 domain 内的记录的未保存更改不包括在内。如果希望使 DSum 函数基于更改的值,必须先通过单击“记录”菜单上的“保存记录”来保存更改,然后将焦点移动到其他记录,或者使用 Update 方法。

     

     

     

     

     

     

     

     

    示例:dsum('字段a','表A',"条件B")

    展开全文
  • 如果INSERT语句末尾指定了ON DUPLICATE KEY UPDATE,并且插入行后会导致一个UNIQUE索引或PRIMARY KEY出现重复值,则出现重复值的行执行UPDATE;如果不会导致唯一值列重复的问题,则插入新行。   例如: ...

    如果在INSERT语句末尾指定了ON DUPLICATE KEY UPDATE,并且插入行后会导致在一个UNIQUE索引或PRIMARY KEY中出现重复值,则在出现重复值的行执行UPDATE;如果不会导致唯一值列重复的问题,则插入新行。

     

    例如:

     

     

    建表语句:

    CREATE TABLE `consume_locus` (
      `rds` varchar(255) NOT NULL,
      `topic` varchar(255) default NULL,
      `createTime` datetime default NULL,
      `dtsTime` datetime default NULL,
      PRIMARY KEY  (`rds`)
    ) ENGINE=InnoDB DEFAULT CHARSET=latin1;
    
    


    sql语句:

     insert into t_tableName(topic,createTime,dtsTime,rds ) values( null,'2017-02-08 14:02:50','','' )  on duplicate key update topic = values(topic),createTime = values(createTime),dtsTime = values(dtsTime),rds = values(rds) ;
    


     

    这可以保证主键只有一条记录。

    附上一段java代码,算是工具类。根据传入BEAN生成SQL语句。

    package dbTest;
    
    import java.util.Map;
    
    public class DbBean {
    	//列名和列值
    	private Map<String, String> fieldMap;
    	//表名
    	private String tablename;
    	public Map<String, String> getFieldMap() {
    		return fieldMap;
    	}
    	public void setFieldMap(Map<String, String> fieldMap) {
    		this.fieldMap = fieldMap;
    	}
    	public String getTablename() {
    		return tablename;
    	}
    	public void setTablename(String tablename) {
    		this.tablename = tablename;
    	}
    	
    }
    


     

    public class testDB {
    	
    	public static void main(String args[]) throws InterruptedException{
    		String createTimeStr=DateUtil.dateToStr(new Date(), DateUtil.YYYYMMDDHHMMSS2);
    		Map<String, String> fieldMap=new HashMap<String, String>();
    		fieldMap.put("rds", ClusterClientCore.rdsCode);
    		fieldMap.put("topic", ClusterClientCore.topic);
    		fieldMap.put("createTime", createTimeStr);
    		fieldMap.put("dtsTime", ClusterClientCore.dtsTimestamp);
    		DbBean bean =new DbBean();
    		bean.setFieldMap(fieldMap);
    		bean.setTablename("t_tableName");
    		String sql=getInsertSqlStr(bean);
    			System.out.println(sql);
    	}
    	
    	/**
    	 * 把bean转换为sql语句
    	 * @param bean
    	 * @return
    	 */
    	public static String getInsertSqlStr(DbBean bean){
    		StringBuffer columName=new StringBuffer();
    		StringBuffer columValue=new StringBuffer();
    		//幂等操作
    		StringBuffer duplicateSb=new StringBuffer();
    		Map<String, String> fieldMap=bean.getFieldMap();
    		Iterator it=fieldMap.entrySet().iterator();
    		while(it.hasNext()){
    			Map.Entry<String, Object> entry=(Map.Entry<String, Object>)it.next();
    			String key=entry.getKey();
    			duplicateSb.append(key).append(" = values(").append(key).append("),");
    			columName.append(key).append(",");
    			if(entry.getValue()!=null){
    			String value=(String)entry.getValue();
    			columValue.append("'").append(value).append("'").append(",");
    			}else{
    				columValue.append(entry.getValue()).append(",");
    			}
    		}
    		String columNameStr=columName.deleteCharAt(columName.length()-1).toString();
    		String columValueStr=columValue.deleteCharAt(columValue.length()-1).toString();
    		String sqlStr="insert into "+ bean.getTablename()+"("+columNameStr+" ) values( "+columValueStr+" ) ";
    		String duplicateStr=" on duplicate key update "+duplicateSb.deleteCharAt(duplicateSb.length()-1).toString()+" ;";
    		return sqlStr+duplicateStr;
    	}
    }


     

     

    展开全文
  • MySQL数据库update更新子查询

    千次阅读 2015-04-24 18:00:28
    比如:UPDATE test.tb_vobile a set a.name = '111 'WHEREa.id = (select max(id) id from test.tb_vobile) 报错:[SQL]UPDATE test.tb_vobile a set a.name = '111 'WHEREa.id = (select max(id) id from test....

    比如:

    UPDATE test.tb_vobile a 
    set a.name = '111 '
    WHERE
    a.id = (select max(id) id from test.tb_vobile) 

    报错:

    [SQL]UPDATE test.tb_vobile a 
    set a.name = '111 '
    WHERE
    a.id = (select max(id) id from test.tb_vobile) 


    [Err] 1093 - You can't specify target table 'a' for update in FROM clause


    以下可通过:

    UPDATE test.tb_vobile a 
    join 
    (select max(id) id from test.tb_vobile) b 
    on a.id = b.id 
    set a.name = '123 ';

    UPDATE test.tb_vobile a ,(select max(id) id from test.tb_vobile) b 
    set a.name = '321 '
    WHERE
    a.id = b.id ;

    说明:

    1、update 时,更新的表不能在set和where中用于子查询;
    2、update 时,可以对多个表进行更新(sqlserver不行);
    如:update ta a,tb b set a.Bid=b.id ,b.Aid=a.id;  
    3、update 后面可以做任意的查询,这个作用等同于from;

    展开全文
  • JAVA SSH中update没有写入数据库

    千次阅读 2017-03-18 23:21:19
    SSH中新增加一个package做impl包时,发现update更新数据,始终无法写入到数据库。 到处查找问题没有找到,后面查了很多资料,终于找到问题出applicationContext.xml文件的。 是spring的切面定义,一个 可以...
  • mysql数据库中字段后面加一个字符串

    千次阅读 2017-08-15 09:41:54
    MySQL连贯字符串不能利用加号(+),而利用concat。 比方aa表的name字段前加字符'x',利用: update aa set name=concat('x',name)
  • 红色部分为重点,update后面接了一个select表,可以以此表字段做where条件或set语句等号后面的内容 简单来说就是UPDATE后面可以接子查询,虽然前面这句话感觉怪怪的
  • MySQL数据库insert和update语句

    千次阅读 2016-04-11 10:16:19
    MySQL数据库insert和update语句 ...标准的SQL有3个语句,它们是INSERT、UPDATE以及DELETE。 用于操作数据库的SQL一般分为两种,一种是查询语句,也就是我们所说的SELECT语句,另外一种就是更新
  • 数据库使用的是独占式封锁机制,当执行对应的SQL语句时(INSERT、UPDATE、DELETE),我们的表就会被锁住,直到commite、回滚或者退出数据库用户,才能执行下一条。 这里的细节和数据库的事务并发问题有关 事务的...
  • 详解MySQL数据库insert和update语句

    千次阅读 2018-01-05 11:37:32
    用于操作数据库的SQL一般分为两种,一种是查询语句...标准的SQL有3个语句,它们是INSERT、UPDATE以及DELETE。 用于操作数据库的SQL一般分为两种,一种是查询语句,也就是我们所说的SELECT语句,另外一种就是更新
  • 导致这种现象出现的原因是,for uodate前关联两张表造成的。 解决办法: where 后面只关联一张表即可,如果必须多表查询,建议使用左/右连接(left join …on…或right join…on)...
  • 0、需求: 插入数据库,记录存在就更新,记录不存在就插入。 id date kinds score 0 2020-01 math ... 1、首先,models... models增加联合唯一(等同于数据库的联合约束) class Meta: ...
  • MySQL 3.23 ,你可以使用 LIMIT # 来确保只有给定的记录行数目被更改。  如果一个 ORDER BY 子句被使用(从 MySQL 4.0.0 开始支持),记录行将以指定的次序被更新。这实际上只有连同 LIMIT 一起才有用。  ...
  • mybatis执行一个update方法,返回值为1,但是数据库中数据并未更新,粘贴sql语句直接在数据库执行,等待好久报错:Lock wait timeout exceeded; try restarting transaction   最后发现: 1.实体前面 是使用JPA...
  • Qt使用SQLite数据库

    千次阅读 2019-12-20 11:46:24
    SQLite(sql)是一款开源轻量级的数据库软件,不需要server,可以集成其他软件,非常适合嵌入式系统。 Qt5以上版本可以直接使用SQLite(Qt自带驱动)。 用法: 1 准备 引入SQL模块 Qt项目文件(.pro文件)...
  • 设计多服务器、多线程数据库同步操作时,最开始是采用的如下方式: // 如果更新成功了,则i=1,否则i=0 int i = "update config t set t.flag =1 where t.key='DB_KEY' and t.flag=0"; // 当i=1...
  • 数据库插入一条数据,先列举出需要插入的字段名称,然后VALUES子句依次写出对应字段的值 INSERT INTO <表名> (字段1, 字段2, …) VALUES (值1, 值2, …);(注意VALUES紧跟括号不要换行和加分号) ...
  • 数据库外键定义的一个可选项,用来设置当主键表的被参考列的数据发生变化时,...on update 和 on delete 后面可以的词语有四个 no action , set null , set default ,cascade no action 表示 不做任何操作...
  • 需求 如下两张表student(学生表)、score(测试成绩表) ...要求:使用一个SQL统计score表,将结果更新到student表的score_sum和score_avg字段。 结果如图: 实现: 如果我们只需要更新一个字段,MYSQL和ORACLE...
  • 最近研究博客网站,其实很多年以前,博客是非常流行的,那时候互联网还处于发展的初级阶段,尤其是中国地区,因此出现了国内-国外两大博客系统,分别是zblog和wordpress程序,当然了,很显然是国外的博客最先...
  • MySQL数据库insert和update语句  引:用于操作数据库的SQL...标准的SQL有3个语句,它们是INSERT、UPDATE以及DELETE。  用于操作数据库的SQL一般分为两种,一种是查询语句,也就是我们所说的SELECT语句,另外
  • for update 数据库锁机制(mysql下测试)

    千次阅读 2017-04-01 16:23:47
    首先,查询数据的时候,如果后面加上 for update ,那个会自动给数据加上锁,这个应该都知道,  然后,加上的锁其实是悲观锁,至于是行级锁还是表级锁,举个栗子 BEGIN ; select * from `user` where id= 1 for UPDATE;//...
  • mongo数据库的操作(update和insert)

    千次阅读 2019-09-09 02:01:38
    update() 方法用于更新已存在的文档。语法格式如下: db.collection.update( <query>, <update>, { upsert: <boolean>, multi: <boolean>, writeConcern: <document> } )...
  • 过程如下:我们在数据库中建立一张表用来存储路径 ,通过repository获得对数据库的操作方法,service层完成文件的加载写入,以及保存数据库。 1.我们先建立一个工程:以下先建立一个叫FileUpload的工程,选择对应...
  • 如何在数据库中存储一棵树

    万次阅读 2013-09-06 11:35:02
    树形结构的数据项目开发比较常见,比如比较典型的是论坛主题留言。 每一个主题(节点)可以有n个留言(子节点)。这些留言又可以有自己的留言。因此这种结构就是一颗树。本文讨论的是数据库中如何存储这种树形...
  • 利用plsql连接oracle数据库, 可以查询出来数据,sql语句后面加上for update就查询不出来数据了解决办法:1.查询出来数据库中锁住的表select b.owner,b.object_name,a.session_id,a.locked_mode from v$locked_...
  • 文章目录一、下载数据库1.新建数据传输,将数据库安装包上传至虚拟机2.安装数据库二、设置用户,更改权限三、使用数据库 一、下载数据库 数据库安装资源 1.新建数据传输,将数据库安装包上传至虚拟机 2.安装...
  • 数据库中的锁

    千次阅读 2016-04-27 11:34:35
    看到网上大多语焉不详(尤其更新锁),所以这里做个简明解释,为下面描述方便,这里用T1代表一个数据库执行请求,T2代表另一个请求,也可以理解为T1为一个线程,T2 为另一个线程。T3,T4以此类推。下面以SQL Server...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 217,729
精华内容 87,091
关键字:

在数据库中update后面跟