• 17 插入数据


    17.1 数据插入

    • 顾名思义,INSERT是用来插入行到数据库表的。插入可以用几种方式使用:
      • 插入完整的行
      • 插入行的一部分
      • 插入多行
      • 插入某些查询的结果
    • 插入及系统安全 可针对每个表或每个用户,利用MySQL的安全机制禁止使用INSERT语句。

    17.2 插入完整的行

    • 把数据插入表中的最简单的方法是使用基本的INSERT语法,它要求指定表名和被插入到新行中的值。下面举一个例 子:
    insert into Customers
    value(NULL, 
        'Pep E. LaPew',
        '100 Main Street',
        'Los Angeles',
        'CA',
        '90046',
        'USA',
        NULL,
        NULL
    );
    
    • 存储到每个表列中的数据在values子句中给出,对每个列必须提供一个值。如果某个列没有值,应该使用NULL值。
    • 虽然这种语法很简单,但并不安全,应该尽量避免使用。
    • 编写INSERT语句的更安全的方法如下:
    insert into Customers(cust_name,
        cust_address,
        cust_city,
        cust_state,
        cust_zip,
        cust_country,
        cust_contact,
        cust_email)
      value(
        'Pep E. LaPew',
        '100 Main Street',
        'Los Angeles',
        'CA',
        '90046',
        'USA',
        NULL,
        NULL
    );
    
    • 因为提供了列名,values必须以其指定的次序匹配指定的列名,不一定按各个列出现在实际表中的次序。其优 点是,即使表的结构改变,此insert语句仍然能正确工作。你会发现cust_id的NULL值是不必要的,cust_id列并没有出现在列表中,所以不需要任何值。
    • 下面的insert语句填充所有列,但以一种不同的次序填充。因为给出了列名,所以插入结果仍然正确:
    insert into customers(cust_name,
            cust_contact,
            cust_email,
            cust_address,
            cust_city,
            cust_state,
            cust_zip,
            cust_country
            )
            values('Pep E. LaPew',
                NULL,
                NULL,
                '100 Main Street',
                'Los Angeles',
                'CA',
                '90046',
                'USA',
            );
    
    • 总是使用列的列表 一般不要使用没有明确给出列的列表的INSERT语句。使用 列的列表能使SQL代码继续发挥作用,即使表结构发生了变化。
    • 仔细地给出值 不管使用哪种INSERT语法,都必须给出values的正确数目。如果不提供列名,则必须给每个表列提供一个值。如果提供列名,则必须对每个列出的列给出一个值,如果不这样,将产生一个错误信息,相应的行插入不成功。
    • 省略列 如果表的定义允许,则可以在insert操作中省略某些列。省略的列必须满足以下某个条件。
      • 该列定义为允许NULL值(无值或空值)
      • 在表定义中给出默认值。这表示如果不给出值,将使用默认值。
    • 提高整体性能 数据库经常被多个客户访问,对处理什么请求以及用什么 次序处理进行管理是MySQL的任务。INSERT操作可能很耗时(特别是有很多索引需要更新时),而且它可能降低等待处理的select语句的性能。
    • 如果数据检索是最重要的,则你可以通过在insert和into之间添加关键字low_priority,指示MySQL降低insert语句的优先级,如下所示:
    insert low_priority into
    

    顺便说一下,这也适用于下一章介绍的update和delete语句。

    17.3 插入多个行

    • insert可以插入一行到一个表中。但如果你想插入多个行怎么办?可以使用多条insert语句,甚至一次提交它 们,每条语句用一个分号结束,如下所示:
    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'
        );
     insert into customers(cust_name,
            cust_address,
            cust_city,
            cust_state,
            cust_zip,
            cust_country
        ) values('M. Martain',
            '42 Galaxy Way',
            'New York',
            'NY',
            '11213',
            'USA'
        );
    
    • 或者,只要每条insert语句中的列名(和次序)相同,可以如下组合各语句:
     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. Martain',
            '42 Galaxy Way',
            'New York',
            'NY',
            '11213',
            'USA'
        );
    
    • 其中单条insert语句有多组值,每组值用一对圆括号括起来,用逗号分隔。
    • 提高insert的性能 此技术可以提高数据库处理的性能,因为MySQL用单条insert语句处理多个插入比使用多条insert语句快。

    17.4 插入检索出的数据

    • isnert一般用来给表插入一个指定列值得行。但是,insert还存在另一种形式,可以利用它将一条insert语句的结果插入表中。这就是所谓的insert select,顾名思义,它是由一条insert语句和一条select语句组成的。
    • 假如你想从另一个表中合并客户列表到你的customers表。不需要每次读取一行,然后再将它用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从custnew中将所有数据导入customers。select语句从custnew检索出要插入的值,而不是列出它们。select中列出的每个列对应于customers表名后所跟的列 表中的每个列。这条语句将插入多少行有赖于custnew表中有多少行。如果这个表为空,则没有行被插入。
  • 相关阅读:
    java加载类的方法1.classloader 2.class.forName()
    servlet与线程与jdbc connection的关系
    static再次深入理解
    多线程读某个共享变量有时候也要给读方法加锁
    多线程读一个全局变量要不要加锁?还是说只是当修改全局变量的时候才要加锁?
    接口耗时打印并统计
    Java从设计模式[本场比赛状态转换武器]状态分析(State)模式
    Openstack中间DVR Part1 -- 东西走向的交通处理
    写酷“大神”的公开信
    从反思谈论阵列和指针的几个问题,腾讯的笔名
  • 原文地址:https://www.cnblogs.com/sanjun/p/8284134.html
Copyright © 2020-2023  润新知