Mysql教程

11.1插入数据

插入数据是向表中插入新的记录。通过这种方式可以为表中增加新的数据。在MySQL中,通过INSERT语句来插入新的数据。使用INSERT语句可以同时为表的所有字段插入数据,也可以为表的指定字段插入数据。INSERT语句可以同时插入多条记录,还可以将一个表中查询出来的数据插入到另一个表中。本小节将详细讲解这些内容。

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

通常情况下,插入的新记录要包含表的所有字段。INSERT语句有两种方式可以同时为表的所有字段插入数据。第一种方式是不指定具体的字段名;第二种方式是列出表的所 有字段。

1.INSERT语句中不指定具体的字段名

在MYSQL中,可以通过不指定字段名的方式为表插入记录。其基本语句形式如下:

INSERT INTO 表名 VALUES( 值1,值2,...,值n);

其中,“表名”参数指定记录插入到哪个表中;“值n”参数表示要插入的数据。“值1” 到“值n”分别对应着表中的每个字段。表中定义了几个字段,INSERT语句中就应该对应有几个值。插入的顺序与表中字段的顺序相同。而且,取值的数据类型要与表中对应字段 的数据类型一致。

【示例11-1】下面向product表中插入记录。插入记录之前,可以通过DESC语句来查看product表的基本结构。査询结果如下:

mysql>DESC product;
+--------+-------------+------+-----+---------+-------+
| Field  | type        | Null | Key | Default | Extra |
+--------+-------------+------+-----+---------+-------+
| id     | int(10)     | NO   | PRI | NULL    |       |
| name   | varchar(20) | NO   |     | NULL    |       |
|function| varchar(20) | NO   |     | NULL    |       |
|company | varchar(20) | NO   |     | NULL    |       |
|address | varchar(20) | NO   |     | NULL    |       |
+--------+-------------+------+-----+---------+-------+
5 row in set(0.00 sec)

从查询结果可以看出,product表包含5个字段。那么取INSERT语句中的值也应该是5个。INSERT语句的代码如下:

INSERT INTO product VALUES(1001,'ABC药物’,'治疗感冒’,'八80制药厂','北京市昌平区’);

结果显示记录插入成功。执行SELECT语句来查询一下PRODUCT表,确认记录已经插入成功。SELECT语句执行结果如下:

mysql>SELECT * FROM product;
+----+--------+------------+-----------+------------+
| id |  name  |  function  |  company  |  address   |
+----+--------+------------+-----------+------------+
|1001|ABC药物 |治疗感冒    |ABC制药厂  |北京市昌平区|
+----+--------+------------+-----------+------------+
1 row in set(0.00 sec)

注意:product表包含5个字段,那么INSERT语句中的值也应该是5个。而且数据类型也应该与字段的数据类型一致。name、function、company和address这4个字段是字符串类型,取值必须加上引号。如果不加上引号,数据库系统会报错。

2.INSERT语句中列出表中所有字段

INSERT语句中可以列出表的所有字段,为这些字段来插入数据。其基本语句形式如下:

INSERT INTO表名(属性1,属性2,...,属性n)VALUES({值1,值2,...值n);

其中,“属性n”参数表示表中的字段名称,此处必须列出表的所有字段的名称;“值n”参数表示每个字段的值,每个值与相应的字段对应。

【示例11-2】下面向product表中插入一条新记录。INSERT语句的代码如下:

INSERT INTO product(id, name, function,company, address) VALUES(1002,'BCD','治疗头疼','BCD制药厂','北京市海淀区');

执行结果显示,记录已经成功插入到product表中。通过SELECT语句来查询product表,来确认记录是否真的已经存在。SELECT语句执行如下:

mysql>SELECT * FROM product WHERE id=1002;
+----+--------+------------+-----------+------------+
| id |  name  |  function  |  company  |  address   |
+----+--------+------------+-----------+------------+
|1002|  BCD   |  治疗头疼    | BCD制药厂  | 北京市海淀区|
+----+--------+------------+-----------+------------+
1 row in set(0.06 sec)

查询结果显示,记录已经插入成功。如果表的字段比较多,用第二种方法就比较麻烦。 但是,第二种方法比较灵活。可以随意的设置字段的顺序,而不需要按照表定义时的顺序。 值的顺序也必须跟着字段顺序的改变而改变。

【示例11-3】下面向product表中插入一条新记录,INSERT语句中字段的顺序与表定义时的顺序不同。INSERT语句的代码如下:

INSERT INTO product(id, function, name, address , company)VALUES(1003,'AB康复丸','北京市顺义区','AB康复制药厂');

name字段和company字段的顺序发生了改变。其对于值的位置也跟着发生了改变。

结果显示,记录插入成功。执行SELECT语句查询product以表。SELECT语句执行结果如下:

mysql>SELECT * FROM product WHERE id=1003;
+----+--------+------------+------------+------------+
| id |  name  |  function  |  company   |  address   |
+----+--------+------------+------------+------------+
|1003|AB康复丸|  治疗癌症    | AB康复制药厂| 北京市顺义区|
+----+--------+------------+-----------+------------+
1 row in set(0.00 sec)

11.1.2为标的指定字段插入数据

如果上一节中讲解的INSERT语句只是指定部分字段,这就可以为表中的部分字段插 数据了。其基本语句形式如下:

INSERT INTO表名(属性1,属性2,...,属性n VALUES(值1,值2, ...值n);

其中,“属性n’参数表示表中的字段名称,此处指定表的部分字段的名称;“值n” 参数表示指定字段的值,每个值与相应的字段对应。

【示例11-4】下面向product表的id、name和company这3个字段插入数据,INSERT语句的代码如下:

INSERT INTO product(id, name, company) VALUES(1004, 'EF咳嗽灵’ ,'EF制药厂');

结果显示,记录插入成功。执行SELECT语句查询PRODUCT表。SELECT语句执行结果如下:

mysql>SELECT * FROM product WHERE id=1003;
+----+--------+------------+------------+------------+
| id |  name  |  function  |  company   |  address   |
+----+--------+------------+------------+------------+
|1004|EF咳嗽灵 |    NULL    |   EF制药厂  |    NULL    |
+----+--------+------------+-----------+-------------+
1 row in set(0.00 sec)

查询结果显示,记录已经插入成功。但是,function字段和address字段都为空值 (NULL)。执行SHOW CREATE TABLE语句来查看product表的详细表结构。执行结果如下:

mysql>SHOW CREATE  TABLE product \G
********************1.row******************
Table:product
Create Table:CREATE TABLE 'product'(
'id' int(10) NOT NULL,
'name' varchar(20) NOT NULL,
'function' varchar(50)DEFAULT NULL,
'company' varchar(20) NOT NULL,
'address' varchar(50) DEFAULT NULL,
PRIMARY KEY ('id'),
UNIQUE KEY 'id'('id')
)ENGINE=InnoDB DEFAULT CHARSET=utf8
1 row in set(0.00 sec)

查询结果可以看出,function字段和address字段的默认值为空值(NULL)。因为这两个没有插入值,数据库系统自动为其插入了默认值。所以这两个字段的值才为空值。

注意:没有赋值的字段,数据库系统会为其插入默认值。这个默认值是在创建表的时候 定义的。如上面function字段和address字段的默认值为NULL。如果某个字段没有设置默认值,而且是非空。这就必须为其赋值。不然数据库系统会提示“Field ’name' doesn't have a default value” 这样的错误。这种方式也可以随意的设置字段的顺序,而不需要按照表定义时的顺序。

11.1.3同时插入多条记录

同时插入多条记录,是指一个INSERT语句插入多条记录。当用户需要插入好几条记录,用户可以使用上面两个小节中的方法逐条插入记录。但是,每次都要写一个新的INSERT语句。这样比较麻烦。MySQL中, —个INSERT语句可以同时插入多条记录。其基本语法形式如下:

INSERT INTO表名[(属性列表)] VALUES(取值列表1),(取值列表2)...(取值列表n);

其中,“表名”参数指明向哪个表中插入数据;“属性列表”参数是可选参数,指定哪些字段插入数据,没有指定字段时向所有字段插入数据;“取值列表^’参数表示要插入的记录,每条记录之间用逗号隔开。

技巧:向MySQL的某个表中插入多条记录时,可以使用多个INSERT语句逐条插入记录,也可以使用一个INSERT语句插入多条记录。选择哪种方式通常根据个人喜 好来决定。如果插入的记录很多时,一个INSERT语句插入多条记录的方式的速度会比较快。

【示例11-5】下面向product表中插入3条新记录。INSERT语句的代码如下:

INSERT INTO product VALUES
(1006,'头疼灵1号’,’治疗头疼',’00制药厂’,_北京市房山区’),
(1007,'头疼灵2号’,'治疗头疼',’00制药厂','北京市房山区'),
(1008,'头疼灵3号’,'治疗头疼’,'00制药厂',’北京市房山区');

执行结果显示,这3条记录己经成功插入到product表中。通过SELECT语句来查询 product表,SELECT语句执行如下:

mysql>SELECT * FROM product WHERE id=1003;
+----+--------+------------+------------+------------+
| id |  name  |  function  |  company   |  address   |
+----+--------+------------+------------+------------+
|1006|头疼灵1号|  治疗头疼   |  DD制药厂  | 北京市房山区 |
|1007|头疼灵2号|  治疗头疼   |  DD制药厂  | 北京市房山区 |
|1008|头疼灵3号|  治疗头疼   |  DD制药厂  | 北京市房山区 |
+----+--------+------------+-----------+-------------+
3 row in set(0.08 sec)

查询结果显示,这3条记录己经插入成功。

不指定字段时,必须为每个字段都插入数据。如果指定字段,就只需要为指定的字段插入数据。

11.1.4将查询结果插入到列表中

INSERT语句可以将一个表中查询出来的数据插入到另一表中。这样,可以方便不同表之间进行数据交换。其基本语法形式如下:

INSERT INTO 表名 (属性列表1) SELECT 属性列表2 FROM 表名2 WHERE 条件表达式;

其中,“表名1”参数说明记录插入到哪个表中;“表名2”参数表示记录是从哪个表中查询出来的;“属性列表1”参数表示为哪些字段赋值;“属性列表2”表示从表中查询出 哪些字段的数据;“条件表达式”参数设置了SELECT语句的查询条件。

说明:使用这种方法时,必须保证“字段列表1”和“字段列表2”中的字段个数是一样的。而且,每个对应的字段的数据类型是一样的。如果数据类型不一样,数据 库系统会报错。然后,阻止INSERT语句向下执行

【示例11-6】下面将medicine表中所有数据查询出来,然后插入到product表中。插 入之前,先执行SELECT语句来查看medicine表中的记录。SELECT语句执行结果如下:

mysql>SELECT * FROM product WHERE id=1003;
+----+--------+------------+------------+-------------+
| id |  name  |  function  |  company   |  address    |
+----+--------+------------+------------+-------------+
|2001| 止咳1号 |  治疗咳嗽   | 咳嗽药制药厂 | 北京市顺义区 |
|2002| 止咳2号 |  治疗咳嗽   | 咳嗽药制药厂 | 北京市顺义区 |
|2003| 止咳3号 |  治疗咳嗽   | 咳嗽药制药厂 | 北京市顺义区 |
+----+--------+------------+-----------+--------------+
3 row in set(0.08 sec)

从查询结果可知,medicine表共有3条记录。每条记录有5个字段。这5个字段分别是id、name、function、company、address。下面将medicine表的所有数据查询出来,然后插入到product以表中。INSERT语句的代码如下:

INSERT INTO product(id, function, name, address , company) SELECT id, function, name, address , company FROM medicine ;

代码执行如下:

mysql>INSERT INTO product(id, function, name, address , company) SELECT id, function, name, address , company FROM medicine ;
+----+--------+------------+------------+-------------+
| id |  name  |  function  |  company   |  address    |
+----+--------+------------+------------+-------------+
|2001| 止咳1号 |  治疗咳嗽   | 咳嗽药制药厂 | 北京市顺义区 |
|2002| 止咳2号 |  治疗咳嗽   | 咳嗽药制药厂 | 北京市顺义区 |
|2003| 止咳3号 |  治疗咳嗽   | 咳嗽药制药厂 | 北京市顺义区 |
+----+--------+------------+-----------+--------------+
3 row in set(0.08 sec)

关注微信获取最新动态