3.3.2 插入数据
用户可以使用INSERT语句,向已创建好的数据表中插入数据,可以插入一个或多个元组,也可以插入子查询结果。
(1)插入一个元组
插入一个元组的INSERT语句的基本格式如下:
说明:
table_or_view_name:要插入数据的表或视图的名称;
column_list:指定要将数据插入的列。需用括号将其括起来,并且用逗号进行分隔。可选参数,若column_list省略,则新插入的元组必须在每个属性列上均有值;
value_list:指定每个列对应插入的数据,需用圆括号将值列表括起来。对column_list (如果已指定)或表中的每个列,都必须有一个数据值。
【例3.15】 将一个新的学生元组插入到Student表中,学号:“201818123”,姓名:“陈东”,性别:“男”,出生日期:“2001-12-14”,所在学院:“计算机”。
INSERT INTO Student(Sno,Sname,Ssex,Sbirthday,Sdept)
VALUES(201818123,陈东,男,2001-12-14,计算机);
在INTO子句中指出了表名Student,并指出了新增加的元组在哪些属性上要赋值,属性的顺序可以与CREATE TABLE中的顺序不一样。VALUES子句对新元组的各属性赋值,字符串常量及日期型常量要用单引号括起来。
如果新元组要在表的所有属性列上都有指定值,且属性列的次序与CREATE TBALE中的次序相同,则INTO子句中可以只指出表名,没有属性名。上述SQL语句可以修改如下:
INSERT INTO Student
VALUES(201818123,陈东,男,2001-12-14,计算机);
(2)插入多个元组
利用VALUES子句插入多个元组的INSERT语句语法格式如下:
【例3.16】 在Student表中插入三个元组。
INSERT INTO Student(Sno,Sname,Ssex,Sbirthday,Sdept)
VALUES(201818104,钱壮壮,男,2001-1-14,大数据),(201818153,陈东与,男,2001-11-08,会计学),(201818133,任雾,女,2001-08-14,艺术学);
(3)插入子查询结果
子查询不仅可以嵌套在SELECT语句中用以构造父查询的条件,也可以嵌套在INSERT语句中用以生成要插入的批量数据。其基本格式如下:
说明:
<object>同插入一个元组的INSERT语句中的<object>;
subquery:子查询。如果column_list省略,则子查询所得到的数据列必须和要插入数据的基本表的数据列完全一致。如果column_list给出,则子查询结果与其要一一对应。
【例3.17】 如果已建有课程平均分表Course_Avg(Cno,AvgGrade),其中Cno为课程号,AvgGrade为每门课程的平均分,假设该表现在是空表。现向Course_Avg表中插入每门课程的平均分信息。
INSERT INTO Course_Avg(Cno,AvgGrade)
SELECT Cno,AVG(Grade)
FROM SC
GROUP BY Cno;
执行该语句时,首先从SC表中查询每门课程的课程号及平均成绩,然后将查询结果插入到Course_Avg表中。
在向表中添加记录时,无论使用“对象资源管理器”,还是使用INSERT语句,都应注意以下几个问题:
①表中数据的类型、长度、是否允许为空等属性必须与定义表结构时一致。如:Student表的Sbirthday列是datetime类型,应按如“2000-02-06”的格式输入,这样系统才会接受,否则将出现“类型不一致”的提示;
②Course表的Cno列长度是4个字节,如果输入超过此长度,如“00000000001”,则会出现“与此值列的长度不一致”的提示;
③Course表中的Cpno列允许为空,则可以不输入数据,有些不允许为空的列则必须输入数据;
④主键列的数据不能有重复。如:Ctudent表的Sno列为主键,各记录中的Sno不能有重复数据,否则会出现“违反了PRIMARY KEY约束”的提示;
⑤SC表的Sno列和Cno列一起作为联合主键,各记录中的这两列不能同时相同,但可以一列相同、一列不同;
⑥某些列要遵守其约束的规定。如:SC表的Grade列要遵守CHECK约束,即该列的数值必须大于0,否则将会出现“违反了CHECK约束”的提示;
⑦外键列中的数据必须是其参照表(参照列)中已有的数据,因此插入数据时,应先输入其参照表的数据。如:SC表的Sno列、Cno列是外键,参照表(参照列)分别是Student表的Sno列和Course表的Cno列。SC表的Sno列中的数据必须是Student表的Sno列中已有的数据,Cno列中的数据必须是Course表的Cno列中已有的数据。如果输入其他数据,将会出现“FOREIGN KEY约束冲突”的提示,因此,在这3个表中输入数据时,应先输入Student表和Course表的数据,再输入SC表的数据;
⑧在INSERT语句中使用SELECT时,引用的表既可以是相同的,也可以是不同的;要插入数据的表必须已经存在;要插入数据的表必须和SELECT语句的结果集兼容,兼容的含义是列的数量和顺序必须相同、列的数据类型兼容等。