14. 插入数据

利用INSERT语句将数据插入表中

14.1. 数据插入

用来插入(添加)行到数据库。

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

14.1.1. 插入完整的行

指定表名和被插入到新行中的值。编写依赖与特定列次序的SQL语句,这样做有时会出错,但编写方便。

mysql> INSERT INTO Customers
    -> VALUES('1000000006',
    -> 'Toy Land',
    -> '123 Any Street',
    -> 'New York',
    -> 'NY',
    -> '11111',
    -> 'USA',
    -> NULL,
    -> NULL);
Query OK, 1 row affected (0.01 sec)

解释: 插入一个新客户到Customers表,存储到每个表列的数据 VALUES 子句中给出,对每个表必须。提供一个值,如果某列没值,就应该使用NULL值。

养成指定顺序插入数据,虽然写起来繁琐,但不容易发生错误。注意每个列,都必须提供一个值。

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

14.1.2. 插入部分行

指定某列提供值,其他的不提供值

mysql> INSERT INTO Customers(cust_id,
    -> cust_name,
    -> cust_address,
    -> cust_city,
    -> cust_state,
    -> cust_zip,
    -> cust_country)
    -> VALUES('1000000008',
    -> 'Toy Land',
    -> '123 Any Street',
    -> 'New York',
    -> 'NY',
    -> '11111',
    -> 'USA');
Query OK, 1 row affected (0.01 sec)

解释:忽略表中cust_ontact 与cust_email 值。插入部分值,前提条件是表允许

  • 改列定义为允许NULL值
  • 表改成默认值,如果不给,将使用默认

如果没有这两个前天条件,就服务插入部分值。

14.2. 插入检索出的数据

利用SELECT 语句的输出结果插入表中,INSERT SELECT两条结合。

新键一个表

mysql> CREATE TABLE CustomersNew
    -> (
    ->   cust_id      char(10)  NOT NULL ,
    ->   cust_name    char(50)  NOT NULL ,
    ->   cust_address char(50)  NULL ,
    ->   cust_city    char(50)  NULL ,
    ->   cust_state   char(5)   NULL ,
    ->   cust_zip     char(10)  NULL ,
    ->   cust_country char(50)  NULL ,
    ->   cust_contact char(50)  NULL ,
    ->   cust_email   char(255) NULL
    -> );
Query OK, 0 rows affected (0.06 sec)

插入是注意主键值不能重复。

mysql> INSERT INTO CustomersNew(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 Customers;

解释:将CustomersNew所有的数据导入Customers

14.3. 从一个表复制到另一个表

只复制表结构,不复制数据。

mysql> CREATE TABLE Customers_New like Customers;
Query OK, 0 rows affected (0.03 sec)

创建一个CustCopy 表,并把Customers表中的数据复制过来。

mysql> CREATE TABLE CustCopy AS
    -> SELECT *
    -> FROM Customers;
Query OK, 8 rows affected (0.03 sec)
Records: 8  Duplicates: 0  Warnings: 0

查看一个表是如果创建的

mysql> SHOW CREATE TABLE Customers;

查看表的结构

mysql> DESC Customers
  • 任何 SELECT 选择的子句都可以使用。WHEREGROUP BY
  • 可以利用链接从多个表插入数据
  • 不过从多少个表检索出来的数据,数据都只能插入一个表中。

SELECT INTO 可以用来测试SQL语句前,复制一个表出来测试,避免影响原来的表。

下一节:利用UPDATE和DELETE语句进行操作表数据。