zoukankan      html  css  js  c++  java
  • 3.插入数据

    1.插入数据

    在mysql中,可以使用INSERT语句向数据库表中插入数据记录,插入数据的方式有:插入完整的记录,插入记录的一部分,插入另一个查询的结果。

    1.1 为表的所有字段插入数据

    使用基本的INSERT语句插入数据要求指定表名称和插入到记录中的值,基本语法格式为:

    INSERT INTO table_name (column_list) VALUES (value_list);
    

    table_name指定要插入数据的表名,column_list指定要插入数据的列,,value_list指定每个列要插入的数据。注意,使用该语句时字段列和数据值的数量必须相同。
    以表person为例进行介绍,创建语句如下:

    mysql> CREATE TABLE person
        ->
        -> (
        -> id INT UNSIGNED NOT NULL AUTO_INCREMENT,
        -> name CHAR(40) NOT NULL DEFAULT '',
        -> age INT NOT NULL DEFAULT 0,
        -> info CHAR(50) NULL,
        -> PRIMARY KEY(id)
        -> );
    Query OK, 0 rows affected (0.92 sec)
    

    向表中所有字段插入值的方法有两种:一种是指定所有字段名,另一种是完全不指定字段名。
    例:
    在person表中插入一条新记录,id值为1,name值为Green,age值为21,info值为Lawyer。
    执行插入操作之前,使用SELECT语句查看表中的数据:

    mysql> SELECT * FROM person;
    Empty set (0.23 sec)
    

    结果显示当前表为空,没有数据,接下来执行插入操作:

    mysql> INSERT INTO person (id,name,age,info)
        -> VALUES (1,'Green',21,'Lawyer');
    Query OK, 1 row affected (0.13 sec)
    

    语句执行完毕,查看执行结果:

    mysql> SELECT * FROM person;
    +----+-------+-----+--------+
    | id | name  | age | info   |
    +----+-------+-----+--------+
    |  1 | Green |  21 | Lawyer |
    +----+-------+-----+--------+
    1 row in set (0.00 sec)
    

    可以看到插入记录成功。在插入数据时,指定了person表的所有字段,因此将为每一个字段插入新的值。
    INSERT语句后面的列名称顺序可以不是person表定义时的顺序。即插入数据时,不需要按照表定义的顺序插入,只要保证值的顺序与列字段的顺序相同就可以,如下:
    例2:
    在person表中,插入一条新记录,id值为2,name值为Suse,age值为22,info值为dancer,SQL语句如下:

    mysql> INSERT INTO person (age,name,id,info)
        -> VALUES (22,'Suse',2,'dancer');
    Query OK, 1 row affected (0.14 sec)
    

    语句执行完毕,查看执行结果:

    mysql> SELECT * FROM person;
    +----+-------+-----+--------+
    | id | name  | age | info   |
    +----+-------+-----+--------+
    |  1 | Green |  21 | Lawyer |
    |  2 | Suse  |  22 | dancer |
    +----+-------+-----+--------+
    2 rows in set (0.00 sec)
    

    由结果可以看到,INSERT语句成功插入了一条记录。
    使用INSERT插入数据时,允许列名column_list为空,此时,需要为表的每一个字段指定值,并且值的顺序必须和数据表定义字段时的顺序相同:

    mysql> INSERT person
        -> VALUES (3,'Mary',24,'Musician');
    Query OK, 1 row affected (0.12 sec)
    
    mysql> SELECT * FROM person;
    +----+-------+-----+----------+
    | id | name  | age | info     |
    +----+-------+-----+----------+
    |  1 | Green |  21 | Lawyer   |
    |  2 | Suse  |  22 | dancer   |
    |  3 | Mary  |  24 | Musician |
    +----+-------+-----+----------+
    3 rows in set (0.00 sec)
    

    1.2 为表的指定字段插入数据

    为表的指定字段插入数据,就是用INSERT语句为部分字段插入值,而其他字段的值为定义表时的默认值:

    mysql> INSERT INTO person (name,age,info)
        -> VALUES ('Willam',20,'sports man');
    Query OK, 1 row affected (0.14 sec)
    
    mysql> SELECT * FROM person;
    +----+--------+-----+------------+
    | id | name   | age | info       |
    +----+--------+-----+------------+
    |  1 | Green  |  21 | Lawyer     |
    |  2 | Suse   |  22 | dancer     |
    |  3 | Mary   |  24 | Musician   |
    |  4 | Willam |  20 | sports man |
    +----+--------+-----+------------+
    4 rows in set (0.00 sec)
    

    查询结果显示,id字段自动添加了一个整数值4.在这里,id字段为表的主键,不能为空,系统会自动为该字段插入自增的序列值。在插入记录时,如果某些字段没有指定插入值,MySQL将插入定义该字段时的默认值:

    mysql> INSERT INTO person (name,age) VALUES ('Laura',25);
    Query OK, 1 row affected (0.36 sec)
    
    mysql> SELECT * FROM person;
    +----+--------+-----+------------+
    | id | name   | age | info       |
    +----+--------+-----+------------+
    |  1 | Green  |  21 | Lawyer     |
    |  2 | Suse   |  22 | dancer     |
    |  3 | Mary   |  24 | Musician   |
    |  4 | Willam |  20 | sports man |
    |  5 | Laura  |  25 | NULL       |
    +----+--------+-----+------------+
    5 rows in set (0.00 sec)
    

    可以看到,在本例插入语句中,没有指定info字段的值,查询结果显示,info字段在定义时默认为NULL,因此系统自动为该字段插入空值。
    注意:要保证每个插入值的类型和对应列的数据类型匹配,如果类型不同,将无法插入,并且会产生错误。

    1.3 同时插入多条记录

    INSERT语句插入时指定多个值列表,每个值列表之间用逗号隔开:

    mysql> INSERT INTO person(name,age,info)
        -> VALUES ('Evans',27,'secretary'),
        -> ('Dale',22,'cook'),
        -> ('Edison',28,'singer');
    Query OK, 3 rows affected (0.36 sec)
    Records: 3  Duplicates: 0  Warnings: 0
    
    mysql> SELECT * FROM person;
    +----+--------+-----+------------+
    | id | name   | age | info       |
    +----+--------+-----+------------+
    |  1 | Green  |  21 | Lawyer     |
    |  2 | Suse   |  22 | dancer     |
    |  3 | Mary   |  24 | Musician   |
    |  4 | Willam |  20 | sports man |
    |  5 | Laura  |  25 | NULL       |
    |  6 | Evans  |  27 | secretary  |
    |  7 | Dale   |  22 | cook       |
    |  8 | Edison |  28 | singer     |
    +----+--------+-----+------------+
    8 rows in set (0.00 sec)
    

    使用INSERT语句同时插入多条记录时,MySQL会返回一些在执行单行插入时没有的额外信息,这些包含的字符串的意思分别如下:

    • Records:表明插入的记录条数。
    • Duplicates:表明插入时被忽略的记录,原因可能是这些记录包含了重复的主键值。
    • Warnings:表明有问题的数据值,例如发生数据类型转换。

    1.4 将查询结果插入表中

    INSERT INTO table_name (column_list1)
    SELECT (column_list2) FROM table_name2 WHERE (condition)
    

    table_name1指定待插入数据的表:column_list1指定待插入表中要插入数据的列;table_name2指定插入数据的来源表;column_list2指定数据来源表的查询列,该列表必须和column_1列表中的字段个数及数据类型相同;condition指定SELECT语句的查询条件。
    例:从person_old表中查询所有的记录,并将其插入person表中。

    mysql> CREATE TABLE person_old
        -> (
        -> id INT UNSIGNED NOT NULL AUTO_INCREMENT,
        -> name CHAR(40) NOT NULL DEFAULT '',
        -> age INT NOT NULL DEFAULT 0,
        -> info CHAR(50) NULL,
        -> PRIMARY KEY (id)
        -> );
    Query OK, 0 rows affected (0.31 sec)
    

    向person_old表中添加两条记录:

    mysql> INSERT INTO person_old
        -> VALUES (11,'Harry',20,'student'), (12,'Beckham',31,'police');
    Query OK, 2 rows affected (0.06 sec)
    Records: 2  Duplicates: 0  Warnings: 0
    
    mysql> SELECT * FROM person_old;
    +----+---------+-----+---------+
    | id | name    | age | info    |
    +----+---------+-----+---------+
    | 11 | Harry   |  20 | student |
    | 12 | Beckham |  31 | police  |
    +----+---------+-----+---------+
    2 rows in set (0.00 sec)
    

    可以看到插入记录成功,接下来将person_old表中所有记录插入到person表中,SQL语句如下:

    mysql> INSERT INTO person(id,name,age,info)
        -> SELECT id,name,age,info FROM person_old;
    Query OK, 2 rows affected (0.16 sec)
    Records: 2  Duplicates: 0  Warnings: 0
    

    查看执行结果:

    mysql> SELECT * FROM person;
    +----+---------+-----+------------+
    | id | name    | age | info       |
    +----+---------+-----+------------+
    |  1 | Green   |  21 | Lawyer     |
    |  2 | Suse    |  22 | dancer     |
    |  3 | Mary    |  24 | Musician   |
    |  4 | Willam  |  20 | sports man |
    |  5 | Laura   |  25 | NULL       |
    |  6 | Evans   |  27 | secretary  |
    |  7 | Dale    |  22 | cook       |
    |  8 | Edison  |  28 | singer     |
    | 11 | Harry   |  20 | student    |
    | 12 | Beckham |  31 | police     |
    +----+---------+-----+------------+
    10 rows in set (0.00 sec)
    
  • 相关阅读:
    其实很简单——SpringIOC详解
    设计模式之原型模式与深拷贝、浅拷贝
    《Understanding the JVM》读书笔记之五——类加载器
    《Understanding the JVM》读书笔记之四——类加载机制
    《Understanding the JVM》读书笔记之三——垃圾收集器
    《Understanding the JVM》读书笔记之二——垃圾回收算法
    《Understanding the JVM》读书笔记之一——JVM内存模型
    开始实现功能(一)——用户模块,从注册登录开始
    网站后台搭建--springboot项目是如何创建的
    从网站功能入手创建数据库
  • 原文地址:https://www.cnblogs.com/xiaotufei/p/13338443.html
Copyright © 2011-2022 走看看