精华内容
下载资源
问答
  • 一、单条插入数据: #!/usr/bin/python3 import pymysql # 打开数据库连接 db = pymysql.connect("localhost","testuser","test123","TESTDB" ) # 使用cursor()...

    一、单条插入数据:

    
    #!/usr/bin/python3
     
    import pymysql
     
    # 打开数据库连接
    db = pymysql.connect("localhost","testuser","test123","TESTDB" )
     
    # 使用cursor()方法获取操作游标 
    cursor = db.cursor()
     
    # SQL 插入语句  里面的数据类型要对应
    sql = "INSERT INTO EMPLOYEE(FIRST_NAME, \
           LAST_NAME, AGE, SEX, INCOME) \
           VALUES ('%s', '%s',  %s,  '%s',  %s)" % \
           ('Mac', 'Mohan', 20, 'M', 2000)
    try:
       # 执行sql语句
       cursor.execute(sql)
       # 执行sql语句
       db.commit()
    except:
       # 发生错误时回滚
       db.rollback()
     
    # 关闭数据库连接
    db.close()
    

     

    二、批量插入数据:

    #!/usr/bin/env python
    # -*-encoding:utf-8-*-
    
    import pymysql
    
    # 打开数据库连接
    db = pymysql.connect("localhost","root","123","testdb")
    
    # 使用 cursor() 方法创建一个游标对象 cursor
    cursor = db.cursor()
    
    # SQL 插入语句
    sql = "INSERT INTO EMPLOYEE(FIRST_NAME, \
           LAST_NAME, AGE, SEX, INCOME) \
           VALUES (%s,%s,%s,%s,%s)"
    # 区别与单条插入数据,VALUES ('%s', '%s',  %s,  '%s', %s) 里面不用引号
    
    val = (('li', 'si', 16, 'F', 1000),
           ('Bruse', 'Jerry', 30, 'F', 3000),
           ('Lee', 'Tomcat', 40, 'M', 4000),
           ('zhang', 'san', 18, 'M', 1500))
    try:
       # 执行sql语句
       cursor.executemany(sql,val)
       # 提交到数据库执行
       db.commit()
    except:
       # 如果发生错误则回滚
       db.rollback()
    
    # 关闭数据库连接
    db.close()
    

     

    展开全文
  • 文章目录一、前言二、批量插入前准备1、插入到数据表的字段2、计算一行字段占用的空间3、在数据里做插入操作的时候,整体时间的分配三、批量插入数据测试1、SQL语句的大小限制2、查看服务器上的参数:3、计算一次能...

    一、前言

          我们在操作大型数据表或者日志文件的时候经常会需要写入数据到数据库,那么最合适的方案就是数据库的批量插入。只是我们在执行批量操作的时候,一次插入多少数据才合适呢?假如需要插入的数据有百万条,那么一次批量插入多少条的时候,效率会高一些呢?这里博主和大家一起探讨下这个问题,应用环境为批量插入数据到临时表。

    二、批量插入前准备

          博主本地原本是循环查出来的数据,然后每1000条插入一次,直至完成插入操作。但是为什么要设置1000条呢,实不相瞒,这是因为项目里的其他批量插入都是一次插1000条。。汗,博主不服,所以想要测试下。

          首先是查看当前数据库的版本,毕竟各个版本之间存在差异,脱离版本讲数据库就是耍流氓(以前没少耍啊):

    mysql> select version();
    +------------+
    | version()  |
    +------------+
    | 5.6.34-log |
    +------------+
    1 row in set (0.00 sec)
    

    1、插入到数据表的字段

          对于手动创建的临时表来说,字段当然是越少越好,而且字段占用的空间要尽量小一些,这样临时表不至于太大,影响表操作的性能。这里需要插入的字段是:

    字段1 int(10)
    字段2 int(10)
    字段3 int(10)
    字段4 varchar(10)
    

          我们一共插入四个字段,分别是3个int类型的,一个varchar类型的,整体来说这些字段都比较小,占用的内存空间会小一些。

    2、计算一行字段占用的空间

          对于innodb引擎来说,int类型可以存储4个字节,里面的Int(M)并不会影响存储字节的大小,这个M只是数据的展示位数,和mysqlZEROFILL属性有关,即在数字长度不够的数据前面填充0,以达到设定的长度。此处不多说,想要了解的朋友可以百度一下,还是很有意思的。
          varchar(10)代表可以存储10个字符,不管是英文还是中文,最多都是10个,这部分假设存储的是中文,在utf-8mb4下,10个中文占用10*4 = 40个字节那么一行数据最多占用:4+4+4+40 = 52字节

    3、在数据里做插入操作的时候,整体时间的分配

    链接耗时 (30%)
    发送query到服务器 (20%)
    解析query (20%)
    插入操作 (10% * 词条数目)
    插入index (10% * Index的数目)
    关闭链接 (10%)
    

          从这里可以看出来,真正耗时的不是操作,而是链接,解析的过程。单条sql的话,会在链接,解析部分耗费大量的时间,因此速度会很慢,所以我们一般都是采用批量插入的操作,争取在一次链接里面写入尽可能多的数据,以此来提升插入的速度。但是这个尽可能多的数据是多少呢?一次到底插入多少才合适呢?

    三、批量插入数据测试

          开始测试,但是一开始插入多少是合适的呢,是否有上限?查询mysql手册,我们知道sql语句是有大小限制的。

    1、SQL语句的大小限制

          my.ini 里有 max_allowed_packet 这个参数控制通信的 packet 大小。mysql默认的sql语句的最大限制是1Mmysql5.7的客户端默认是16M,服务端默认是4M),可以根据设置查看。官方解释是适当增大 max_allowed_packet 参数可以使client端到server端传递大数据时,系统能够分配更多的扩展内存来处理。

    官方手册:https://dev.mysql.com/doc/refman/5.7/en/server-system-variables.html
    

    2、查看服务器上的参数:

    mysql> show variables like '%max_allowed_packet%';
    +--------------------------+------------+
    | Variable_name            | Value      |
    +--------------------------+------------+
    | max_allowed_packet       | 33554432   |
    | slave_max_allowed_packet | 1073741824 |
    +--------------------------+------------+
    2 rows in set (0.00 sec)
    

          33554432字节 = 32M ,也就是规定大小不能超过32M

    3、计算一次能插入的最大行记录

          1M计算的话,(1024*1024)/52 ≈ 20165 ,为了防止溢出,最大可一次性插入20000条(根据自己的配置和sql语句大小计算)。那么32M的话就是:20000 *32 = 640000 也就是64W条。

    4、测试插入数据比对

    (1)插入11W条数据,按照每次10,600,1000,20000,80000来测试:

    +---------------+
    | count(c1.uin) |
    +---------------+
    |         110000 |
    +---------------+
    

    有个博客说一次插入10条最快,,我觉得一次插的有点少,咱们试试

    参考:https://www.cnblogs.com/aicro/p/3851434.html
    

          这个博主测试后,认为一次插10条是性能最快的,他的每条记录是3kb,相当于我的59行数据,取个整数60,那么对于这个博主是插入10条,对我来说插入:600,这几个值都试试。

    耗时:

    11W的数据,每次插入10条。耗时:2.361s
    11W的数据,每次插入600条。耗时:0.523s
    11W的数据,每次插入1000条。耗时:0.429s
    11W的数据,每次插入20000条。耗时:0.426s
    11W的数据,每次插入80000条。耗时:0.352s
    

          从这部分看,随着批量插入的增加,速度略有提升,最起码一次插10条应该不是最佳的。插入数据量多,减少了循环的次数,也就是在数据库链接部分的耗时有所减少,只是这个8W并不是极限数据,具体一次插入多少条,还有待参考。

    (2)加大数据量到24w

    +---------------+
    | count(c1.uin) |
    +---------------+
    |        241397 |
    +---------------+
    

    耗时:

    
    24W的数据,每次插入10条。耗时:4.445s
    24W的数据,每次插入600条。耗时:1.187s
    24W的数据,每次插入1000条。耗时:1.13s
    24W的数据,每次插入20000条。耗时:0.933s
    24W的数据,每次插入80000条。耗时:0.753s
    

          一次插入24W反而性能最佳,这么代表我们的测试数据量依然不够。

    (3)加大测试量到42W

    +---------------+
    | count(c1.uin) |
    +---------------+
    |        418859 |
    
    

    耗时:

    42W的数据,每次插入1000条。耗时:2.216s
    42W的数据,每次插入80000条。耗时:1.777s
    42W的数据,每次插入16W条。耗时:1.523s
    42W的数据,每次插入20W条。耗时:1.432s
    42W的数据,每次插入30W条。耗时:1.362s
    42W的数据,每次插入40W条。耗时:1.764s
    

          随着插入量的增加,批量插入条数多了之后,性能是有所提升的。但是在达到30W以上之后,效率反而有所下降。这部分我的理解是mysql是要分配一定的内存给传过来的数据包使用,当批量插入的数据量到达一定程度之后,一次插入操作的开销就很耗费内存了。个人感觉,最佳大小是max_allowed_packet的一半,也就是极限能插入64W,选用32W也许性能会更好一些,同时也不会对mysql的其他操作产生太大的影响。

    5、如果插入的值就是sql语句限制的最大值,那么性能真的好吗?

          博主疯狂谷歌百度,都没有找到有人来具体的说一下这个问题,不过在高性能mysql里面发现一句话:
          客户端用一个单独的数据包将查询请求发送给服务器,所以当查询语句很长的时候,需要设置max_allowed_packet参数。但是需要注意的是,如果查询实在是太大,服务端会拒绝接收更多数据并抛出异常。与之相反的是,服务器响应给用户的数据通常会很多,由多个数据包组成。但是当服务器响应客户端请求时,客户端必须完整的接收整个返回结果,而不能简单的只取前面几条结果,然后让服务器停止发送。因而在实际开发中,尽量保持查询简单且只返回必需的数据,减小通信间数据包的大小和数量是一个非常好的习惯,这也是查询中尽量避免使用SELECT *以及加上LIMIT限制的原因之一。

          后面通过各种百度,博主觉得最大只是代表传输数据包的最大长度,但性能是不是最佳就要从各个方面来分析了。比如下面列出的插入缓冲,以及插入索引时对于缓冲区的剩余空间需求,以及事务占有的内存等,都会影响批量插入的性能。

    四、其他影响插入性能的因素

    1、首先是插入的时候,要注意缓冲区的大小使用情况

          在分析源码的过程中,有一句话:如果buffer pool余量不足25%,插入失败,返回DB_LOCK_TABLE_FULL。这个错误并不是直接报错:max_allowed_packet 不够大之类的,这个错误是因为对于innodb引擎来说,一次插入是涉及到事务和锁的,在插入索引的时候,要判断缓冲区的剩余情况,所以插入并不能仅仅只考虑max_allowed_packet的问题,也要考虑到缓冲区的大小。

    参考淘宝的数据库日报:http://mysql.taobao.org/monthly/2017/09/10/

    2、插入缓存

          另外对于innodb引擎来说,因为存在插入缓存(Insert Buffer)这个概念,所以在插入的时候也是要耗费一定的缓冲池内存的。当写密集的情况下,插入缓冲会占用过多的缓冲池内存,默认最大可以占用到1/2的缓冲池内存,当插入缓冲占用太多缓冲池内存的情况下,会影响到其他的操作。

          也就是说,插入缓冲受到缓冲池大小的影响,缓冲池大小为:

    mysql> show variables like 'innodb_buffer_pool_size';
    +-------------------------+-----------+
    | Variable_name           | Value     |
    +-------------------------+-----------+
    | innodb_buffer_pool_size | 134217728 |
    +-------------------------+-----------+
    

          换算后的结果为:128M,也就是说,插入缓存最多可以占用64M的缓冲区大小。这个大小要超过咱们设置的sql语句大小,所以可以忽略不计。

    详细解释:

          我们都知道,在InnoDB引擎上进行插入操作时,一般需要按照主键顺序进行插入,这样才能获得较高的插入性能。当一张表中存在非聚簇的且不唯一的索引时,在插入时,数据页的存放还是按照主键进行顺序存放,
    但是对于非聚簇索引叶节点的插入不再是顺序的了,这时就需要离散的访问非聚簇索引页,由于随机读取的存在导致插入操作性能下降。

          InnoDB为此设计了Insert Buffer来进行插入优化。对于非聚簇索引的插入或者更新操作,不是每一次都直接插入到索引页中,而是先判断插入的非聚集索引是否在缓冲池中,若在,则直接插入;若不在,则先放入到一个Insert Buffer中。看似数据库这个非聚集的索引已经查到叶节点,而实际没有,这时存放在另外一个位置。然后再以一定的频率和情况进行Insert Buffer和非聚簇索引页子节点的合并操作。这时通常能够将多个插入合并到一个操作中,这样就大大提高了对于非聚簇索引的插入性能。

    参考:https://cloud.tencent.com/developer/article/1200824
    参考:mysql技术内幕 Innodb篇

    3、使用事务提升效率

          还有一种说法,使用事务可以提高数据的插入效率,这是因为进行一个INSERT操作时,MySQL内部会建立一个事务,在事务内才进行真正插入处理操作。通过使用事务可以减少创建事务的消耗,所有插入都在执行后才进行提交操作。大概如下:

    START TRANSACTION;
    INSERT INTO `insert_table` (`datetime`, `uid`, `content`, `type`) 
        VALUES ('0', 'userid_0', 'content_0', 0);
    INSERT INTO `insert_table` (`datetime`, `uid`, `content`, `type`) 
        VALUES ('1', 'userid_1', 'content_1', 1);
    ...
    COMMIT;
    

    参考:https://my.oschina.net/songhongxu/blog/163063

          事务需要控制大小,事务太大可能会影响执行的效率。MySQLinnodb_log_buffer_size配置项,超过这个值会把innodb的数据刷到磁盘中,这时,效率会有所下降。所以比较好的做法是,在数据达到这个这个值前进行事务提交。

    查看: show variables like '%innodb_log_buffer_size%';
    +------------------------+----------+
    | Variable_name          | Value    |
    +------------------------+----------+
    | innodb_log_buffer_size | 67108864 |
    +------------------------+----------+
    
    大概是:64M
    

          这种写法和批量写入的效果差不多,只不过sql语句还是单句的,然后统一提交。一个瓶颈是SQL语句的大小,一个瓶颈是事务的大小。当我们在提交sql的时候,首先是受到sql大小的限制,其次是受到事务大小的限制。在开启事务的情况下使用批量插入,会节省不少事务的开销,如果要追求极致的速度的话,建议是开着事务插入的。不过需要注意一下,内存是有限且共享的,如果批量插入占用太多的事务内存,那么势必会对其他的业务操作等有一定的影响。

    4、通过配置提升读写性能

          也可以通过增大innodb_buffer_pool_size 缓冲区来提升读写性能,只是缓冲区是要占用内存空间的,内存很珍贵,所以这个方案在内存富裕,而性能瓶颈的时候,可以考虑下。

    参考:https://my.oschina.net/anuodog/blog/3002941

    5、索引影响插入性能

          如果表中存在多个字段索引,当对表中的数据进行增加、删除和修改的时候,索引也要动态的维护。这样就降低了数据的插入速度。对于普通的数据表,主键索引是肯定要有的,想要加快性能的话,就是要有序插入,每次插入记录都在索引的最后面,索引的定位效率很高,并且对索引调整较小。如果插入的记录在索引中间,需要B+tree进行分裂合并等处理,会消耗比较多计算资源,并且插入记录的索引定位效率会下降,数据量较大时会有频繁的磁盘操作。

    五、总结

          博主经过测试+谷歌,最终是选用的一次批量插入数据量为max_allowed_packet大小的一半。只是在不断的搜索中,发现影响插入性能的地方挺多的,如果仅仅是拿max_allowed_packet这个参数作为分析,其实是没有意义的,这个参数只是设置最大值,但并不是最佳性能。不过需要注意,由于sql语句比较大,所以才执行完插入操作之后,一定要释放变量,不要造成无谓的内存损耗,影响程序性能。

          对于我们的mysql来说也是一样的,mysql的最佳性能是建立在各个参数的合理设置上,这样协同干活儿的效果最佳。如果其他设置不到位的话,就像是木桶原理一样,哪怕内存缓冲区设置的很大,但是性能取决的反而是设置最差的那个配置。关于mysql的配置调优,我们都在路上,加油!

    end

    展开全文
  • SQL 插入数据

    万次阅读 2019-02-17 10:38:40
    SQL 插入数据 一、数据插入: INSERT用来将行插入(或添加)到数据库表。 插入有几种方式: 1.插入完整的行。 2.插入行的一部分。 3.插入某些查询的结果。 注意:插入及系统安全 使用INSERT语句可能需要...

    SQL 插入数据

    一、数据插入:

    • INSERT用来将行插入(或添加)到数据库表。

    • 插入有几种方式:

      1.插入完整的行。

      2.插入行的一部分。

      3.插入某些查询的结果。

    • 注意:插入及系统安全

      • 使用INSERT语句可能需要客户端/服务器DBMS中的特定安全权限。在你试图使用INSERT前,应该保证自己有足够的安全权限。

    1.1:插入完整的行:

    • 把数据插入表中的最简单方法是使用基本的INSERT语法,指定表名和插入到新行中的值

      INSERT  INTO  Customers VALUES (
        '10000006', 'Toy Land', '123 Any Street', 'New York', 'NY', '11111', 'USA', NULL, NULL
      )
      
      • 将顾客信息插入到Customers表中。存储到表中每一列的数据再VALUES子句中给出,必须给每一项提供一个值
      • 如果某列没有值,则应该使用NULL值(假定表允许对该列指定空值)
      • 各列必须以它们再表定义中出现的次序填充。
    • 注意:INTO 关键字

      • 再某些SQL实现中,跟在INSERT之后的INTO关键字是可选的。
    • 上面的SQL语句高度依赖于表中列的定义次序,还依赖于其容易获得的次序信息。即使可以得到这种次序信息,也不能保证各列再下一次表结构变动后保持完全相同的次序。因此编写依赖于特定列次序的SQL语句是很不安全的。

    • 编写INSERT语句的更安全(不过更烦琐)

      INSERT INTO Customers (
          cust_id,
          cust_name,
          cust_address,
          cust_city,
          cust_state,
          cust_zip,
          cust_country,
          cust_contact,
          cust_email
      )
      VALUES (
          '100000006',
          'Fe Cow',
          'QIQIHER',
          'USA',
          'NY',
          '161041',
          'USA',
          NULL,
          NULL
      );
      
      • 再表名后的括号里明确给出了列名。
      • 再插入行时,DBMS将用VALUES列表中的相应值填入列表中的对应项。
      • VALUES中的第一个值对应于第一个指定列名,第二个值对应第二个指定列名
      • 优点:
        • 即使表的结构改变,这条INSERT语句仍然能正确的工作。
    • 提示:总是使用列的列表

      • 不要使用没有明确给出列的INSERT语句。
    • 注意:小心使用VALUES

      • 不管使用哪种INSERT语法,VALUES的数目必须正确
      • 如果不提供列名,则必须给每个列提供一个值;如果提供列名,则必须给列出的每个列一个值

    1.2:插入部分行:

    • 使用INSERT的推荐方法是明确给出表的列名。这种语法,还可以省略列,表示可以只给某些列提供值,给其他列不提供值

      INSERT INTO Customers(
      	cust_id,
      	cust_name,
      	cust_address,
      	cust_city,
      	cust_state,
      	cust_zip,
      	cust_country  
      )
      VALUES(
      	'1000000006',
      	'Toy Land',
      	'123 Any Street',
      	'New York',
      	'NY',
      	'11111',
      	'USA'
      );
      
      • 再前面的栗子中,没有给出cust_contact和cust_email这两列提供值。这表示没有必要再INSEERT语句中包含它们。因此这里省略了这两列及其对应的值。
    • 注意:省略列

      • 如果表的定义允许,则可以再INSERT操作用中省略某些列。省略的列必须满足以下某个条件。

        1.该列定义为允许NULL值(无值或空值)。

        2.再表定义中给出默认值。(这表示如果不给出值,将使用默认值)

      • 如果对表中不允许NULL值且没有默认值的列不给出值,DBMS将产生错误信息,并且相应的行插入不成功。

    • 注意:省略所需的值

      • 如果表中不允许有NULL值或者默认值,这时却省略了表中的值,DBMS就会产生错误信息,相应的行不能成功插入。

    1.3:插入检索出的数据:

    • INSERT一般用来给表插入具有指定列值的行。

    • INSERT还存在另一种形式,可以利用它将SELECT语句的结果插入表中,这就是所谓的INSERT SELECT。

    • 假如把另一个表中的顾客列合并到Customers表中:

      INSERT INTO Customers(
          cust_id,
          cust_contact,
          cust_email,
          cust_name,
          cust_address,
          cust_city,
          cust_state,
          cust_zip,
          cust_country
      )
      SELECT  cust_id,
              cust_contact,
              cust_email,
              cust_name,
              cust_address,
              cust_city,
              cust_state,
              cust_zip,
              cust_country
      FROM CustNew;
      
      • 例子使用INSERT SELECT从CustNew中将所有数据导入Customers。
      • SELECT语句从CustNew检索出要插入的值,而不是列出它们。
      • SELECT中列出的每一列对应于Customers表名后所跟的每一列。
    • 注意:INSERT SELECT中的列名

      • 在INSERT和SELECT语句中使用了相同的列名。但是,不一定要求列名匹配。
      • 它使用的是列的位置,因此SELECT中的第一列(不管其列名)将用来填充表列中指定的第一列,第二列将用来填充表列中指定的第二列,如此等等。
      • INSERT SELECT中SELECT语句可以包含WHERE子句,以过滤插入的数据。
    • 注意:插入多行

      • INSERT通常只插入一行。要插入多行,必须执行多个INSERT语句。
      • INSERT SELECT是个例外,它可以用一条INSERT插入多行,不管SELECT语句返回多少行,都将被INSERT插入。

    二、从一个表复制到另一个表:

    • 有一种数据插入不使用INSERT语句。要将一个表的内容复制到一个全新的表(运行中创建的表),可以使用SELECT INTO语句。

      CREATE TABLE CustCopy AS
      SELECT * FROM Customers;
      
      • 将Customers表中的数据,复制到了CustCopy表中。
    展开全文
  • MySQL插入数据

    万次阅读 2017-11-02 15:51:00
    MySQL插入数据

      MySQL通过INSERT来插入行到数据库表中,通常有以下几种情况:
      1.插入完整的行;
      2.插入行的一部分;
      3.插入多行;
      4.插入某些查询的数据。

    一、插入完整的行

      下面为插入一行数据到表customers中的例子:

    USE crashcourse;
    INSERT INTO customers (
        cust_name,
        cust_address,
        cust_city,
        cust_state,
        cust_zip,
        cust_country,
        cust_contact,
        cust_email
    )
    VALUES (
        'Pep E. LaPew',
        '100 Main Street',
        'Los Angeles',
        'CA',
        '90046',
        'USA',
        'NULL',
        'NULL'
    );

    执行结果:
    这里写图片描述
    提示插入成功,再查看该表:
    这里写图片描述

    发现最后一行为刚才插入的数据。刚才给出的例子是在表名后的括号中明确给出了列名,在插入时MySQL将用VALUES列表中的相应值填入列表中的对应项。即VALUES中的第一个值对应于第一个指定的列名,第二个值对应第二个列名,以此类推。因为提供了列名,VALUES必须以其指定的次序匹配指定的列名,不一定按各个列出现的实际表中的次序。这种方法的优点是即使表的结构改变,此INSERT语句任然可以正常工作。而且可以省略允许省略的列。下面为不指定列名插入数据的例子,必须按表中的实际顺序插入,且不能省略任何列:

    INSERT INTO customers 
    VALUES (
        NULL,
        'Pep E. LaPew',
        '100 Main Street',
        'Los Angeles',
        'CA',
        '90046',
        'USA',
        'NULL',
        'NULL'
    );

    省略列: 如果在表的定义允许,则可以在INSERT操作中省略某些列。省略的列必须满足一下某个条件:
      1.该列定义为允许NULL值(无值或空值);
      2.在表中定义了给出默认值。这表示如果不给出值,将使用默认值。

      如果表中不允许NULL值,且没有默认值的列不给出值,则MySQL将产生一条错误消息,并且相应的行插入不成功。

    二、插入多行

      插入多行和插入单行类似,只是在VALUES中用逗号把每一组值分隔开来即可,下面为例子:

    INSERT INTO customers (
        cust_name,
        cust_address,
        cust_city,
        cust_state,
        cust_zip,
        cust_country
    )
    VALUES (
        'Pep E. LaPew',
        '100 Main Street',
        'Los Angeles',
        'CA',
        '90046',
        'USA'
    ),
    (
        'M. Martian',
        '42 Galaxy Way',
        'New York',
        'NY',
        '11213',
        'USA'   
    );

    三、插入检索出的数据

      INSERT可以将一条SELECT语句的结果插入表中,这就是所谓的INSERT SELECT。如果想要把两张表合并为一张表,不需要每次读取一行,然后将它用INSERT插入,可以如下操作:

    INSERT INTO customers (
        cust_id,
        cust_contact,
        cust_email,
        cust_name,
        cust_address,
        cust_city,
        cust_state,
        cust_zip,
        cust_country
    )
    SELECT  cust_id,
        cust_contact,
        cust_email,
        cust_name,
        cust_address,
        cust_city,
        cust_state,
        cust_zip,
        cust_country
    FROM custnew;

      在这个例子中INSERT和SELECT语句使用了相同的列名。但是不一定要求列名匹配,事实上,MySQL甚至不关心SELECT返回的列名。它使用的是列的位置,因此SELECT中的第一列将用来填充表列中指定的第一个列,第二列将用来填充表列中的第二列,如此等等。这对于从使用不同列名的表中导入数据是非常有用的。

      INSERT SELECT中SELECT语句可以包含WHERE语句以过滤插入的数据。

    展开全文
  • Vue.js连接数据库并插入数据

    万次阅读 2018-10-30 20:30:41
    Vue.js连接数据库并插入数据 以下是我的学习总结: 要求:在vue页面输入用户名和密码进行登陆,用户名和密码数据保存到数据库 需要工具/软件: 安装XAMPP 安装Vue.js 1-1:建立PHP站点 1-2:创建...
  • SQLServer插入数据

    万次阅读 2018-08-08 10:52:14
    使用数据库管理工具插入数据 打开数据库,选则要插入数据的表-》右键点击-》选择插入前200行-》在右边视图中输入要插入的数据(如果字段设置为不为空,则必须输入,如果字段设置为可空,则不必须输入,插入部分、单...
  • SQL批量插入数据

    万次阅读 2018-11-02 14:18:28
    SQL批量插入数据: INSERT INTO orders (Company,OrderNumber) VALUES (‘W3School’,‘2356’),(‘Apple’,‘4698’),(‘W3School’,‘6953’)
  • Oracle插入数据

    万次阅读 2019-04-03 11:26:14
    1、创建表格并指定结构 CREATE TABLE DB3.STUINFO( STUID INT, STUNAME VARCHAR(10), SEX INT, AGE INT, CLASSNO VARCHAR(10), STUADDRESS VARCHAR(10), ...2、插入数据 规范用法 INSE...
  • mysql批量插入数据,一次插入多少行数据效率最高? 2019.08.29 21:20 31351浏览 一、前言 我们在操作大型数据表或者日志文件的时候经常会需要写入数据到数据库,那么最合适的方案就是数据库的批量插入。只是我们在...
  • 文章目录一、前言二、批量插入前准备1、插入到数据表的字段2、计算一行字段占用的空间3、在数据里做插入操作的时候,整体时间的分配三、批量插入数据测试1、SQL语句的大小限制2、查看服务器上的参数:3、计算一次能...
  • python MongoDB 插入数据 去除重复数据

    千次阅读 2019-05-14 17:31:19
    python 往MongoDB数据库中插入数据,经常会遇到的一个需求就是,对插入的数据进行去重。 最笨的方法呢,就是先把所有的数据插入数据库里,再去除掉多余重复的数据。具体操作呢,繁琐,复杂,效率低,还总容易出现...
  • Hive插入数据

    万次阅读 2017-08-29 17:17:44
    1、创建完表之后,就可以插入数据了,在hive中,一般使用LOAD DATA插入数据,数据来源一般为两种,一种是从本地文件系统,第二种是从hadoop文件系统。基本语法如下:LOAD DATA [LOCAL] INPATH 'filepath' [OVERWRITE...
  • 再提示用户”是否插入数据”,若要插入数据,则把插入的数据插入到数组中,且仍按顺序输出;最后求出最大值,和最小值,输出。 代码如下: #include <stdio.h> //预处理语句 #define N 5 //定义一个符号常量 ...
  • Sql Server 插入数据的同时返回插入数据的ID/主键信息
  • Impala插入数据

    千次阅读 2017-10-20 15:14:21
    1、使用impala shell插入数据,基本语法如下: 插入一条新数据:INSERT INTO table_name [(c1,c2,…,cn)] VALUES(v1,v2,…,vn);覆盖数据表中现有数据:INSERT OVERWRITE table_name[(c1,c2,…,cn)] VALUES(v1,v2,…...
  • 当我们进行测试数据或者进行某种大数据量的时候,可以用一下语句进行大批量插入, 通过我的测试,10万条数据插入时间为7秒左右,100万条记录插入时间为65秒,200万插入为150秒。.../* 插入数据 */ insert i.
  • TP5插入数据

    千次阅读 2019-06-18 14:38:21
    有3种方法实现插入数据 insert, 返回值是影响记录的行数,插入数 insertGetId 返回插入数据的自增加id insertAll() 一次性插入多条数据, 返回数据成功的行数 <?php namespace app\index\controller; use ...
  • 1:service层循环调用dao层插入数据,一条一条来 2:拼接sql类似 insert into citytable (province,...) select ... union all select ... union all 在后台先拼接几百条然后插入 3:xml里用foreach循环插入 ...
  • hive使用动态分区插入数据详解

    万次阅读 多人点赞 2018-05-20 15:21:57
    往hive分区表中插入数据时,如果需要创建的分区很多,比如以表中某个字段进行分区存储,则需要复制粘贴修改很多sql去执行,效率低。因为hive是批处理系统,所以hive提供了一个动态分区功能,其可以基于查询参数的...
  • MySQL中如何插入数据

    千次阅读 2020-05-09 21:52:13
    插入数据1数据插入2插入完整行3插入多个行4插入检索出的数据 1数据插入 INSERT是用来插入(或添加)行到数据库表的。插入可以用几种方式使用: 插入完整的行; 插入行的一部分; 插入多行; 插入某些查询的结果。 ...
  • Mybatis插入一条数据,返回插入数据的id值 应用环境 Mybatis、Mysql 实体类 Mapper接口 Mapper.xml文件中的insert语句 id值 id值将会返回到insert方法对象参数里面的id属性上。 ...
  • 使用mybatis plus批量插入数据

    万次阅读 2020-04-15 21:16:24
    之前用mybaits插入数据时,需要在sql语句中作特殊的处理,然后才能够批量插入数据。 今天试验了一下mybatis plus的批量插入方式,简直太简单了,太爽了,真真切切的体会到了科技就是生产力。。 直接上代码,一条语句...
  • # !/bin/bash #auto insert into mysql batabase ...i++)) #$1为程序运行时的参数,此参数控制你需要插入数据的条数 do mysql -p111 -e "use ld;insert into test01 values ( '"$i"','"lalala...
  • 一、插入数据 1、插入元组 2、插入子查询结果 二、修改数据 1、修改某一个元组的值 2、修改多个元组的值 3、带子查询的修改语句 三、删除数据 1、删除某一个元组的值 2、删除多个元组的值 3、带子查询的...
  • 当插入一条数据时,很多时候想立刻获取当前插入的主键值,通常的做法有如下几种: ...2. 使用特定数据库的 auto_increment 特性,在插入数据完成后,使用 select max(id) 获取主键值; 二、查询之后select @@indentity
  • QT TableWidget插入数据

    万次阅读 2017-01-16 16:17:43
    QT TableWidget插入数据
  • Java批量插入数据

    千次阅读 2017-10-17 17:06:54
    Java批量插入数据 原创 2015年08月25日 14:13:06 3156 实现Java批量插入数据库数据,在javaeye中看到过几篇关于实现Java批量插入数据库数据,转载时没有找到,就自己写一下,也算是对自己学习...
  • mysql插入数据的时候丢失数据

    千次阅读 2019-09-08 10:36:42
    mysql插入数据的时候丢失数据 直接po截图和代码 什么时候会丢失数据? character_set_connection和服务器的字符集比character_set_client小时 如下 什么时候才不会丢失数据? 如下才不会丢失数据 要...
  • sql插入数据时,避免插入重复数据

    万次阅读 2016-11-23 13:18:27
    1.往表T_Mid_WaterIndexArea中插入数据  insert into [dbo].[T_Mid_WaterIndexArea](AreaCode,Year,DO,CODMn,BOD5,COD,NH3N,TP,TN,CompositeIndex) select c.AreaCode,c.Year, --c.AreaName, AVG(c.DO) DO,AVG(c....
  • JDBC插入数据后返回新数据id

    千次阅读 2018-07-08 18:59:19
    使用jdbc向表中插入数据时,有时候需要返回新插入数据的id。比如现在要向两个表中分别插入一条数据,第一条数据插入后生成的id要作为第二条数据的一个字段值。 具体代码: PreparedStatement pstmt = null; ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 219,277
精华内容 87,710
关键字:

插入数据