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)