• 第15课 插入数据


    第15课 插入数据

    15.1 数据插入

    插入有几种方式:

    • 插入完整的行;
    • 插入行的一部分;
    • 插入某些查询的结果。

    15.1.1 插入完整的行

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

    INSERT INTO Customers
    VALUES('1000000006',
           'Toy Land',
           '123 Any Street',
           'New York',
           'NY',
           '11111',
           'USA',
           NULL,
           NULL);
    

    上面的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('1000000006',
           'Toy Land',
           '123 Any Street',
           'New York',
           'NY',
           '11111',
           'USA',
           NULL,
           NULL);
    

    下面的INSERT语句填充所有列(与前面的一样),但以一种不同的次序填充。因为给出了列名,所以插入结果仍然正确:

    INSERT INTO Customers(cust_id,
                          cust_contact,
                          cust_email,
                          cust_name,
                          cust_address,
                          cust_city,
                          cust_state,
                          cust_zip)
    VALUES('1000000006',
           NULL,
           NULL,
           'Toy Land',
           '123 Any Street',
           'New York',
           'NY',
           '11111');
    

    15.1.2 插入部分行

    可以只给某些列提供值,给其他列不提供值。

    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');
    

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

    • 该列定义为允许NULL值(无值或空值)。
    • 在表定义中给出默认值。这表示如果不给出值,将使用默认值。

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

    15.1.3 插入检索出的数据

    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中的列名
    为简单起见,这个例子在INSERT和SELECT语句中使用了相同的列名。但是,不一定要求列名匹配。事实上,DBMS一点儿也不关心SELECT返回的列名。它使用的是列的位置,因此SELECT中的第一列(不管其列名)将用来填充表列中指定的第一列,第二列将用来填充表列中指定的第二列,如此等等。

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

    15.2 从一个表复制到另一个表

    要将一个表的内容复制到一个全新的表(运行中创建的表),可以使用SELECT INTO语句。

    说明:DB2不支持
    DB2不支持这里描述的SELECT INTO。

    与INSERT SELECT将数据添加到一个已经存在的表不同,SELECT INTO将数据复制到一个新表(有的DBMS可以覆盖已经存在的表,这依赖于所使用的具体DBMS)。

    SELECT *
    INTO CustCopy
    FROM Customers;
    

    这条SELECT语句创建一个名为CustCopy的新表,并把Customers表的整个内容复制到新表中。因为这里使用的是SELECT *,所以将在CustCopy表中创建(并填充)与Customers表的每一列相同的列。要想只复制部分的列,可以明确给出列名,而不是使用*通配符。

    MariaDB、MySQL、Oracle、PostgreSQL和SQLite使用的语法稍有不同:

    CREATE TABLE CustCopy AS
    SELECT * FROM Customers;
    

    提示:进行表的复制
    SELECT INTO是试验新SQL语句前进行表复制的很好工具。先进行复制,可在复制的数据上测试SQL代码,而不会影响实际的数据。

    15.3 小结

    我们学习了使用INSERT的几种方法,为什么要明确使用列名,如何用INSERT SELECT从其他表中导入行,如何用SELECT INTO将行导出到一个新表。

  • 相关阅读:
    基于struts2和hibernate的登录和注册功能——完整实例
    (转载)Hibernate的事务管理
    (转载)hibernate缓存
    Hibernate映射解析——七种映射关系
    Hibernate核心组件详解
    Struts2国际化——完整实例代码
    Struts2的手工自定义验证--完整实例代码
    Struts2内置校验器——完整实例代码
    Struts2自定义拦截器——完整实例代码
    Struts2工作原理及流程
  • 原文地址:https://www.cnblogs.com/zhangsonghui/p/13302211.html
Copyright © 2020-2023  润新知