插入数据

我们已经创建了完美的表格来保存数据,但到目前为止,这些表格还是空的。现在是填充它们的时候了。我们推迟了这一时刻,因为更改有数据的表格比空表时更困难。

为了插入这些数据,我们将使用 INSERT INTO 命令。该命令将包含表名、要填充的字段以及每个字段的数据。请注意,您可以选择不指定字段的值,这样做有以下不同原因:

  • 字段有一个默认值,我们很乐意将其用于此特定行

  • 尽管字段没有明确的默认值,但该字段可以取空值;因此,如果不指定字段,MySQL 将自动在此处插入一个空值

  • 字段是主键,并且是自动递增的,我们希望让 MySQL 为我们取下一个 ID

有多种原因可能导致 INSERT INTO 命令失败:

  • 如果未指定字段的值,且 MySQL 无法提供有效的默认值

  • 如果提供的值不属于字段的类型,且 MySQL 无法找到有效的转换

  • 如果指定要为字段设置值,但未能提供值

  • 如果提供带有 ID 的外键,但 ID 不存在于引用表中

我们来看看如何添加行。让我们从 customer 表开始,添加一项 basic 客户和一项 premium 客户,如下所示:

mysql> INSERT INTO customer (firstname, surname, email, type)
    -> VALUES ("Han", "Solo", "han@tatooine.com", "premium");
Query OK, 1 row affected (0.00 sec)

mysql> INSERT INTO customer (firstname, surname, email, type)
    -> VALUES ("James", "Kirk", "enter@prise", "basic");
Query OK, 1 row affected (0.00 sec)

请注意,MySQL 会显示一些返回信息;在本例中,它显示有一条记录受到影响,也就是我们插入的那条记录。我们没有提供 ID,所以 MySQL 只添加了列表中的下一条。由于这是我们第一次添加数据,MySQL 使用了 ID 1 和 2。

让我们试着欺骗 MySQL,添加另一个客户,重复我们在上一节中设置为唯一的电子邮件地址字段:

mysql> INSERT INTO customer (firstname, surname, email, type)
    -> VALUES ("Mr", "Spock", "enter@prise", "basic");
ERROR 1062 (23000): Duplicate entry 'enter@prise' for key 'email'

错误会返回一个错误代码和一条错误信息,当然,也不会插入记录。错误信息通常包含足够的信息,以便了解问题所在以及如何解决。如果不是这种情况,我们可以尝试使用错误代码在互联网上搜索,并注意官方文档或其他用户对此的看法。

如果需要在同一张表中引入多行,且这些行包含相同的字段,可以使用该命令的简短版本,在其中指定字段,然后为每一行提供值组。下面让我们看看在图书表中添加图书时如何使用该命令:

mysql> INSERT INTO book (isbn,title,author,stock,price) VALUES
    -> ("9780882339726","1984","George Orwell",12,7.50),
    -> ("9789724621081","1Q84","Haruki Murakami",9,9.75),
    -> ("9780736692427","Animal Farm","George Orwell",8,3.50),
    -> ("9780307350169","Dracula","Bram Stoker",30,10.15),
    -> ("9780753179246","19 minutes","Jodi Picoult",0,10);
Query OK, 5 rows affected (0.01 sec)
Records: 5 Duplicates: 0 Warnings: 0

与客户一样,我们不会指定 ID,而是让 MySQL 选择合适的 ID。还请注意,现在受影响的行数是 5,因为我们插入了 5 行。

如何利用我们在表中定义的显式默认值?我们可以采用与主键相同的方法:不要在字段列表或值列表中指定它们,MySQL 将直接使用默认值。例如,我们为 book.stock 字段定义的默认值是 1,这对 book 表和 stock 字段来说都很有用。让我们使用此默认值添加另一条记录,如下所示:

mysql> INSERT INTO book (isbn,title,author,price) VALUES
    -> ("9781416500360", "Odyssey", "Homer", 4.23);
Query OK, 1 row affected (0.00 sec)

现在我们有了 bookcustomer,让我们添加一些客户借阅图书的历史数据。为此,请使用图书和客户的数字 ID,如下代码所示:

mysql> INSERT INTO borrowed_books(book_id,customer_id,start,end)
    -> VALUES
    -> (1, 1, "2014-12-12", "2014-12-28"),
    -> (4, 1, "2015-01-10", "2015-01-13"),
    -> (4, 2, "2015-02-01", "2015-02-10"),
    -> (1, 2, "2015-03-12", NULL);
Query OK, 3 rows affected (0.00 sec)
Records: 3 Duplicates: 0 Warnings: 0