第19学时 修 改 数 据
在大多数商业应用程序中,你的用户将通过应用程序自身来修改数据库的表。然而,你
必须知道如何手工修改表中包含的数据,这一点是非常重要的。当我们谈论修改数据时,实
际上是指插入数据、更改数据和删除数据。这一点之所以重要,是因为你可以清除误输入的
数据、更改过时的数据,或是简单地删除旧数据。
本学时的要点包括:
从何入手
插入数据
更新数据
锁定
19.1 从何入手
当我们考虑修改数据的方方面面时,从何处入手是一个大问题。你拥有数据库的理由是
为了给你的公司收集有用的数据。这类数据可以是订单数据、产品性能数据或者用户动态数
据。过去,大量类似的数据被收集、存档,然后被遗忘。现在,随着电子数据库的使用,你
可以存储这些数据并用于为管理分析趋势和创建报表。就这一点而言,你可能会考虑最好从
哪儿开始?现在该记住在你的所有用户数据库中的数据都是极重要的,你必须分外小心并尽
最大努力保护这些数据。
本学时中我们涉及的许多主题是很有用的,但是注意不要在实际使用的成品数据库中试
用。如果必要的话,系统安装的两个用户数据库 (pubs和Northwind)可供试用和破坏。你想要
重建它们也很简单。但是重建一个成品数据库或在成形的系统中重新创建数据却很难。提出
这点警告之后,下面我们进入数据修改的学习。
19.2 插入数据
顾名思义,这部分讲述的是如何在数据库中插入数据。虽然这不是真的数据修改,而更
像创建数据,但它却是其他所有数据修改过程的第一步。毕竟,表中的数据总是从某处产生
的。通过SQL INSERT语句可以把数据加到表里。这条语句比较容易,使用规则很少。
必须记住最基本的规则是,当你对表执行INSERT操作时,实际上是向表内插入了一个行。
如果你没有为表的某一字段指定值, SQL Server将提供该字段已定义的缺省值或插入该列允
许的空值。如果你没有为特定的字段指定值并且定义了该字段不允许空值输入, SQL Server
将产生一个错误并终止语句执行。换句话说,将没有值输入到表里。
正如前面我们所提到的, INSERT语句相对来说比较简单。它仅由两部分组成,如程序清
单19-1所示。第一部分是INSERT关键字本身,后面紧跟着被插入数据的表的名称。你也可以
在INSERT关键字与表名称之间插入 INTO关键字。虽然这不是必须的,但是如果它更有助于
理解,你不妨使用此关键字。如果你不打算向表的所有字段都插入值,可以在表名后的圆括
185第19学时 修 改 数 据
弧内,将要输入数据的列列出来。第一部分有时也被称为 INSERT子句。该语句的第二部分是
VALUES关键字,紧跟着将被存入行的所有数值的列表。这常被称作 VALUES子句或值列表。
程序清单19-1 INSERT 语法
如果没有指定欲插入数值的列的名称,就必须给表中的每一列都准备一个插入值。例如,
如果你的表中有五个列,你就必须列出将要插入表的五个值,否则就会出错。如果列出将要
被插入的列,你还须确保在值列表中准备了同样数量的值,否则也会出错。
你可能会遇到的一个问题是如何判定表中指定列是否可以进行空值操作。当你在 SQL
Query Analyzer中工作时,将会有一个很简单的方法来完成此操作。 sp_help系统存储过程可
被用来判定各种有关你将用到的表的有用信息。程序清单 19-2显示了sp_help存储过程对于
pubs数据库的authors表的用法。
程序清单19-2 sp_help语法
当执行这个命令时, SQL Server将返回大量关于表和表结构的信息。你可以找到所有的
列名称,列的数据类型,是否可为空值,表上有哪些索引,等等。该数据以很宽的格式返回
(426个字符宽),这样你为了找到所需的信息就必须进行大量滚动工作,不过也很值得。你可
以在图19-1中看到程序清单19-2的部分运行结果。
图19-1 程序清单19-2的运行
结果
现在你知道了INSERT语句是什么样子,并知道从哪里找有关表的信息。让我们看看如何
往数据库里装一些数据。我们的许多例子用到了 pubs数据库。记住,不要在成品数据库中试
用这些语句。
第一个例子如程序清单19-3所示,我们将向authors表执行一条INSERT语句。假设新作者
可以及时地向需要的人提供她的全部信息,所以当我们要将这些数据录入数据库时,我们需
186 SQL Server 7 24学时教程
要的一切都已齐备。这时不必列出所有的列,因为我们要向所有列进行插入。
程序清单19-3 向数目有限的列中插入
如果键入这条语句并执行它,你将得到一条信息说明仅有一行受到影响。目前来看,这
并不重要,但是当我们进一步使用 INSERT和DELETE语句时,如果只想修改两行,它却告诉
你修改了两百行的话,就需要好好研究一下了。
程序清单19-3运行的查询很直接。我们告诉SQL Server按照表原有的排列顺序将数值列插
入表。注意,如果插入列的数据为字符串类型,如CHAR或VARCHAR,要将其放在单引号中。
任何插入数值型列的数据都不能放在单引号中。这里,我们来看一个向 authors表再次插入数
据查询。但是这一次我们并未从作者那儿获得所需的全部信息,这次我们只知道作者的名字。
如果你查看表,你将看到au_id列和contract列也是不能为空值的。作者标识 (au_id)是用来区分
作者的唯一编码。在此表的数据中,我们使用的数据是作者的社会保障号码。但是,如果我
们没有那个号码,也可以用一个同样长的唯一编码替补。 contract列是合同号。现在,我们不
得不写INSERT语句将数据插入这些列中,如程序清单 19-4所示。
程序清单19-4 插入需要的列
我们在程序清单19-4中所做的就是列出一些列,同时在 VALUES子句中列出了将要添加到
这些列中的值。因为表中的其他列允许空值,所以这条 INSERT语句可以工作。我们仅将值插
入了上述五个列中,而其他列插入的是什么呢?你运行一下程序清单 19-5中的查询就能明白
了。
如果你看到了如图 19-2所示的查询运行结果,就会发现大多数你没有输入值的列中都包
图19-2 程序清单19-5的查询
结果
187第19学时 修 改 数 据
[1] [2] [3] 下一页