1
数据库原理与应用技术
1.6.4.1 5.4.1 插入数据
5.4.1 插入数据

向一个表中插入记录有两种语句格式,一种是单行插入,另一种是多行插入。

1. 单行插入语句格式

INSERT INTO <表名> [(<属性列1>[,<属性列2 >…])

VALUES (<常量1> [,<常量2>] …)

该语句功能是将新元组插入到指定表中。其中,新元组属性列1的值为常量1,属性列2的值为常量2……如果某些属性列在INTO子句中没有出现,则新元组在这些列上将取空值。

由INTO子句指定要插入数据的表名及属性列,属性列的顺序可与表定义中的顺序不一致。没有指定属性列,表示要插入的是一个完整的元组,且属性列与表定义中的顺序一致,此时新插入的记录必须在每个属性列上均有值。指定部分属性列,插入的新元组在其余属性列上取空值。在这里,属性列的顺序可以与建表时的顺序不同。VALUES子句对新元组的各属性赋值,提供的值必须与INTO子句提供的属性列相匹配,包括值的个数和值的类型。

注意,在SQL Server 2012中插入数据时,表名后若未跟随字段名,则VALUES子句中必须将所有列值写出,否则会出现“插入错误:列名或所提供值的数目与表定义不匹配”的错误。

【例5-51】给例5-1建好的student表插入学生王强的信息,写出相关语句。

解:INSERT INTO student(sno,sname,sex,age,department)

VALUES ('95012','王强','男',18,'计算机')

在这个例子中,没有给出bplace这个字段的值,它会自动附上空值。

【例5-52】将学生马丽的信息插入student表中,写出相关语句。

解:INSERT INTO student

VALUES ('95062','马丽','女',19,'国贸','河南')

注意例5-51与例5-52的区别,例5-52中只指出了表名,没有指出属性名,这表示新元组要在表的所有列上都指定值,列的次序同CREATE TABLE中的次序。VALUES子句对各元组的每个属性赋值,一定要注意与列一一对应,否则会出错。

2. 多行插入语句格式

INSERT INTO <表名> [(<属性列1> [,<属性列2>…)]

<SELECT 子句>

对于多行插入语句,用SELECT 子句完成。SELECT 子句是一条完整的查询语句,在此作为插入语句来使用,执行它时将从表中按条件得到一行或多行数据,插入语句就把查询子句的执行结果插入到给定表中。SELECT子句目标列必须与INTO子句匹配,包括值的个数和值的类型。

【例5-53】对enroll表,每个学生都要选修编译原理c5这门课,将选课信息加入表enroll中,写出相关语句。

解:INSERT INTO enroll(sno,cno)

SELECT sno,'c5' FROM student

例5-53操作的结果是给enroll表添加了多行数据,给该表中的所有同学都添加了编译原理这门课。子查询SELECT子句的目标列必须与INTO子句相匹配。DBMS在执行插入语句时会检查所插元组是否破坏了表上已定义的完整性规则,对有NOT NULL约束的属性列是否提供了非空值,对有UNIQUE约束的属性列是否提供了非重复值,对有值域约束的属性列所提供的属性值是否在值域范围内。添加时需注意,没有列出来的选项,enroll表中的grade属性列应该可以允许为空。