本文说明如何创建和运行更新查询。在需要更新或更改记录集中的现有数据时,应使用更新查询。
注意 执行操作时,请记住不能使用更新查询来向数据库中添加新记录,也不能从数据库中删除整个记录。若要添加新记录,请使用追加查询。若要删除整个记录,请使用删除查询。但是,可以使用更新查询将一个或多个字段中的值设置为 Null 值,此更改与删除记录的一部分具有相同的效果。也可以使用更新查询将 Null 值替换为其他数据,此更改与添加数据具有相同的效果。
有关追加查询的详细信息,请参阅创建追加查询一文。有关使用删除查询来删除数据以及使用更新查询将现有数据设置为 NULL 的详细信息,请参阅使用查询从数据库中删除一项或多项记录一文。
使用更新查询可以添加、更改或删除一条或多条现有记录中的数据。可以将更新查询视为一种功能强大的“查找和替换”对话框形式。可以输入选择条件(大致相当于搜索字符串)和更新条件(大致相当于替换字符串)。与“查找和替换”对话框不同,更新查询可接受多个条件,使您可以一次更新大量记录,并使您可以一次更改多个表中的记录。
执行操作时,请记住下列规则:
不能使用更新查询向表中添加新记录,但可以将现有的 Null 值更改为非 Null 值。若要向一个或多个表中添加新记录,请使用追加查询。
有关追加查询的详细信息,请参阅创建追加查询一文。
不能使用更新查询从表中删除整个记录(行),但可以将现有的非 Null 值更改为 Null 值。若要删除整个记录(该过程还删除主键值),则必须使用删除查询。
有关删除查询的详细信息,请参阅使用查询从数据库中删除一项或多项记录一文。
可以使用更新查询更改一组记录中的所有数据。
另外,不能对以下类型的表字段运行更新查询:
通过计算获得结果的字段。计算字段中的值不会永久驻留于表中。Access 计算出的值仅存在于计算机的临时内存中。由于计算字段没有永久性存储位置,因此不能更新。
使用总计查询或交叉表查询作为记录源的字段。
“自动编号”字段。按照设计,“自动编号”字段中的值仅在您向表中添加记录时才会更改。
联合查询中的字段。
唯一值查询和唯一记录查询(返回无重复的值或记录的查询)中的字段。当使用更新查询时以及尝试在窗体或数据表中输入值来手动更新数据时,此规则适用。
参与表关系的主键,除非将关系设置为通过键字段以及任何相关字段自动级联更新。级联更新时,Access 会在您更改父表(位于一对多关系的“一”端的表)中的主键值时自动更新子表(位于一对多关系的“多”端的表)中的任何外键值。
注意 不能级联使用“自动编号”字段生成主键值的记录的更新。
有关打开和关闭级联更新的详细信息,请参阅本文后面的启用级联更新。
有关向数据库中添加记录或更改现有数据的其他方法的一般信息,请参阅向数据库中添加一条或多条记录一文。
在运行更新查询之前,应当先备份数据库。更新查询的结果无法撤消,因此进行备份可确保始终能够取消更改。
单击“Office 按钮” ,指向“管理”,然后在“管理此数据库”下单击“备份数据库”。
在“备份数据库另存为”对话框中,指定备份副本的名称和位置,然后单击“保存”。
Access 将关闭原始文件,创建备份,然后重新打开原始文件。
若要还原到备份,请关闭并重命名原始文件,以便备份副本可以使用原始版本的名称。将原始版本的名称分配给备份副本,然后在 Access 中打开已重命名的备份副本。
默认情况下,除非您的数据库位于受信任位置或者已签名并受信任,否则 Access 禁用所有动作查询(更新查询、追加查询、删除查询和生成表查询)。如果没有执行上述任一操作,仍然可以通过在文档操作栏上单击“启用内容”来对当前数据库会话启用查询。
如果您尝试运行某个动作查询,但好像没有什么反应,请查看 Access 状态栏中是否显示下列消息:
“此操作或事件已被禁用模式阻止。”
如果看到该消息,请执行下列操作:
在消息栏上,单击“选项”。
将显示“Microsoft Office 安全选项”对话框。
单击“启用此内容”,然后单击“确定”。
再次运行查询。
单击“数据库工具”选项卡,然后在“显示/隐藏”组中单击“消息栏”。
有关禁用模式和 Access 安全的详细信息,请参阅保护 Access 2007 数据库一文。
使用更新查询的最可靠方法是先创建一个可测试选择条件的选择查询。例如,假设您要为某一给定客户将一系列“是/否”字段从“否”更新为“是”。为此,可以向选择查询中添加条件,直到它为该客户返回所有在记录中包含“否”的记录。在确定该查询返回正确的记录后,可将其转换为更新查询,输入更新条件,然后运行查询以更改选定值。本节中的步骤说明如何创建选择查询,然后将其转换为更新查询。
打开包含要更新的记录的数据库。
在“创建”选项卡上的“其他”组中,单击“查询设计”。
将打开查询设计器,并打开“显示表”对话框。
选择包含要更新的记录的表,单击“添加”,然后单击“关闭”。
每个表都会在查询设计器中显示为一个窗口,并且这些窗口会列出每个表中的所有字段。下图显示包含一个典型表的查询设计器。
双击要更新的字段。所选字段显示在查询设计网格的“字段”行中。
可以向查询设计网格中的每一列添加一个表字段。
若要快速添加表中的所有字段,请双击表字段列表顶部的星号(“*”)。下图显示添加了所有字段的查询设计网格。
可以选择在查询设计网格的“条件”行中输入一个或多个条件。下表显示了一些示例条件,并说明了它们对查询结果的影响。
注意 该表中的许多示例都使用通配符以使查询更加灵活和高效。
有关在查询中使用通配符的详细信息,请参阅 Access 通配符参考一文。
条件 |
效果 |
>234 |
返回所有大于 234 的数字。若要查找所有小于 234 的数字,请使用 < 234。 |
>="Cajhen" |
返回从 Cajhen 直至字母表末尾的所有记录。 |
Between #2/2/2007# And #12/1/2007# |
返回 2007 年 2 月 2 日到 2007 年 12 月 1 日之间的日期 (ANSI-89)。如果数据库使用的是 ANSI-92 通配符,则使用单引号 (') 替代井号 (#)。例如:Between '2/2/2007' And '12/1/2007'。 |
Not "德国" |
查找字段内容与“德国”不完全相同的所有记录。该条件将返回除了包含“德国”之外还包含其他字符的记录,如“德国(欧元)”或“欧洲(德国)”。 |
Not "T*" |
查找所有记录,以 T 开头的记录除外。如果数据库使用的是 ANSI-92 通配符字符集,则使用百分号 (%) 替代星号 (*)。 |
Not "*t" |
查找不以 t 结尾的所有记录。如果数据库使用的是 ANSI-92 通配符字符集,则使用百分号 (%) 替代星号 (*)。 |
In(加拿大,英国) |
在列表中,查找包含“加拿大”或“英国”的所有记录。 |
Like "[A-D]*" |
在文本字段中,查找所有以字母 A 到 D 开头的记录。如果数据库使用的是 ANSI-92 通配符字符集,则使用百分号 (%) 替代星号 (*)。 |
Like "*ar*" |
查找包含字母序列“ar”的所有记录。如果数据库使用的是 ANSI-92 通配符字符集,则使用百分号 (%) 替代星号 (*)。 |
Like "Maison Dewe?" |
查找满足以下条件的所有记录:以“Maison”开头并包含另一个含有 5 个字母的字符串,且该字符串的前 4 字母是“Dewe”而最后的字母未知。如果数据库使用的是 ANSI-92 通配符字符集,则使用下划线 (_) 替代问号 (?)。 |
#2/2/2007# |
查找 2007 年 2 月 2 日的所有记录。如果数据库使用的是 ANSI-92 通配符字符集,则在日期两侧用单引号 ('),而不用井号 (#);例如,('2/2/2007')。 |
< Date() - 30 |
使用 Date 函数返回超过 30 天的所有日期。 |
Date() |
使用 Date 函数返回包含当前日期的所有记录。 |
Between Date() And DateAdd("M", 3, Date()) |
使用 Date 和 DateAdd 函数返回从当天起三个月内的所有记录。 |
Is Null |
返回包含 Null(空或未定义)值的所有记录。 |
Is Not Null |
返回包含值的所有记录。 |
"" |
返回包含零长度字符串的所有记录。当您需要向必填字段添加值,但还不知道值是什么时,可以使用零长度字符串。例如,某个字段可能需要传真号码,但某些客户可能没有传真机。在这种情况下,可以输入中间不带空格的一对双引号 ("") 来替代数字。 |
在“设计”选项卡上的“结果”组中,单击“运行”。
确认查询返回要更新的记录。根据需要,您可以选择不希望包括在查询设计中的字段并按 Delete 将其删除。另外,还可以将其他字段拖到查询设计网格上。
转到下一节中的步骤。
在“设计”选项卡上的“查询类型”组中,单击“更新”。
此过程说明如何将选择查询更改为更新查询。在执行此操作时,Access 会在查询设计网格中添加“更新到”行。下图显示了一个更新查询,该查询返回 2005 年 1 月 5 日之后购买的所有资产,并将所有满足该条件的记录的位置更改为“仓库 3”。
找到包含要更改的数据的字段,然后在该字段的“更新到”行中键入您的表达式(更改条件)。
可以在“更新到”行中使用任何有效的表达式。下表显示了一些示例表达式,并说明了它们如何更改数据。
表达式 |
结果 |
"销售人员" |
在文本字段中,将文本值更改为“销售人员”。 |
#8/10/07# |
在日期/时间字段中,将日期值更改为 2007-08-10。 |
是 |
在“是/否”字段中,将值“否”更改为“是”。 |
"PN" & [商品编号] |
将“PN”添加到每个指定商品编号的开头。 |
[单价] * [数量] |
将“单价”和“数量”字段中的值相乘。 |
[运费] * 1.5 |
将“运费”字段中的值增大 50%。 |
DSum("[数量] * [单价]", |
如果当前表中的“产品ID”值与“订单明细”表中的“产品ID”值匹配,则该表达式会通过将“数量”字段中的值与“单价”字段中的值相乘来更新销售总额。该表达式使用 DSum 函数,因为它可以对多个表和表字段执行操作。 |
Right([货主邮政编码], 5) |
截断(删除)文本或数字字符串中最左侧的字符,保留最右边的 5 个字符。 |
IIf(IsNull([单价]), 0, [单价]) |
将“单价”字段中的 Null(未知或未定义)值更改为零 (0) 值。 |
在“设计”选项卡上的“结果”组中,单击“运行”。
将显示一条警告消息。
单击“是”运行查询并更新数据。
注意 运行该查询时,您可能会发现某些字段未显示在结果集中。如果查询包含不更新的字段,则默认情况下 Access 在结果中不显示这些字段。例如,您可能包含了两个表中的 ID 字段以帮助确保查询返回和操作正确的记录。如果不更新这些 ID 字段,则 Access 在结果中不显示这些字段。
许多数据库用户都发现他们必须使用一个表中的数据来更新另一个表中的数据 - 其中许多用户都常常发现该任务很难完成。在需要将一个表中的数据更新到另一个表时,请记住以下规则:源字段和目标字段的数据类型必须匹配或兼容。
此外,在将一个表中的数据更新到另一个表并使用兼容的数据类型替代匹配的数据类型时,Access 会转换目标表中那些字段的数据类型。因此,目标字段中的一些数据可能会被截断(删除)。数据类型转换的限制一节列出了能够以及不能转换数据类型的情况。该表还说明了在哪些情况下转换数据类型可能更改或删除字段中的部分或全部数据,以及哪些数据可能被删除。
将一个表中的数据更新到另一个表的过程包括下面几个主要步骤:
创建更新查询并向该查询添加源表和目标表。
在包含相关信息的字段上联接这些表。
将目标字段的名称添加到查询设计网格的“字段”行。
通过使用下面的语法将源字段的名称添加到查询设计网格的“更新到”行:[source_table].[source_field]。
本节中的步骤假设使用两个相似的表。在此示例中,“顾客”表驻留于刚刚继承的数据库中,其中包含的数据比“客户”表新。您可以看到一些经理的姓名已更改,此外一些地址也已更改。因此,您决定使用“顾客”表中的数据更新“客户”表。
“顾客”表
顾客 ID |
名称 |
地址 |
城市 |
省/市/自治区 |
邮政编码 |
国家/地区 |
电话 |
联系人 |
1 |
博文科学博物馆 |
西直门大街 1 号 |
宁波 |
江苏 |
12345 |
中国 |
(505) 555-2122 |
刘鹏 |
2 |
蓝天航空公司 |
南京路 52 号 |
大连 |
辽宁 |
23456 |
中国 |
(104) 555-2123 |
王力 |
3 |
谷裕酿酒厂 |
春西路 3122 号 |
咸阳 |
陕西 |
34567 |
中国 |
(206) 555-2124 |
张宏 |
4 |
康威医药有限公司 |
玉林街 1 号 |
昆明 |
云南 |
NS1 EW2 |
中国 |
(171) 555-2125 |
周军 |
5 |
光远商贸 |
杨柳巷 2 号 |
哈尔滨 |
56789 |
中国 |
(7) 555-2126 |
费雪梅 |
|
6 |
联合信息技术有限公司 |
3123 75th St. S. |
咸阳 |
陕西 |
34567 |
中国 |
(206) 555-2125 |
王华 |
7 |
星源图文公司 |
人民大街 1587 号 |
长春 |
辽宁 |
87654 |
中国 |
(916) 555-2128 |
杨阳 |
8 |
立特威公司 |
长江西路 3 号 |
重庆 |
四川 |
31415 |
中国 |
(503) 555-2129 |
张明森 |
9 |
乖宝贝玩具公司 |
青羊路 4 号 |
重庆 |
四川 |
31415 |
中国 |
(503) 555-2233 |
宋菲菲 |
“客户”表
客户 ID |
名称 |
地址 |
城市 |
省/市/自治区 |
邮政编码 |
国家/地区 |
电话 |
经理 |
1 |
博文科学博物馆 |
西直门大街 1 号 |
宁波 |
江苏 |
12345 |
中国 |
(505) 555-2122 |
李斯闻 |
2 |
蓝天航空公司 |
南京路 52 号 |
大连 |
辽宁 |
23456 |
中国 |
(104) 555-2123 |
王力 |
3 |
谷裕酿酒厂 |
春西路 3122 号 |
咸阳 |
陕西 |
34567 |
中国 |
(206) 555-2124 |
张宏 |
4 |
康威医药有限公司 |
玉林街 1 号 |
昆明 |
云南 |
NS1 EW2 |
中国 |
(171) 555-2125 |
周军 |
5 |
光远商贸 |
丰收路 134 号 |
哈尔滨 |
56789 |
中国 |
(7) 555-2126 |
费雪梅 |
|
6 |
联合信息技术有限公司 |
3123 75th St. S. |
咸阳 |
陕西 |
34567 |
中国 |
(206) 555-2125 |
霍奎廷 |
7 |
星源图文公司 |
南关大街 67 号 |
长春 |
辽宁 |
87654 |
中国 |
(916) 555-2128 |
何雅莉 |
8 |
立特威公司 |
青羊路 3 号 |
重庆 |
四川 |
31415 |
中国 |
(503) 555-2129 |
李爱杰 |
9 |
乖宝贝玩具公司 |
青羊路 4 号 |
重庆 |
四川 |
31415 |
中国 |
(503) 555-2233 |
宋菲菲 |
在执行操作时,请记住虽然每个表字段的数据类型不必匹配,但必须兼容,这意味着 Access 必须能够将源表中的数据转换为目标表可以使用的类型。在某些情况下,转换过程可能删除一些数据。有关转换数据类型的限制的详细信息,请参阅数据类型转换的限制一节。
下面的步骤假设使用上面两个示例表。您可以根据自己的数据对这些步骤进行相应的调整。
在“创建”选项卡上的“其他”组中,单击“查询设计”。
在“显示表”对话框中,双击源表和目标表将其添加到查询中。每个表都在查询设计器显示为一个窗口。添加完表后,单击“关闭”关闭“显示表”对话框。
通过包含相关信息的字段联接表。为此,请将一个表中的相关字段拖放到另一个表的对应字段中。
例如,如果使用上面显示的两个示例表,则可以将“顾客 ID”字段拖动到“客户 ID”字段。在执行此操作时,Access 会在两个表中的这两个字段之间创建关系,并使用该关系来联接任何相关记录。
在“设计”选项卡上的“查询类型”组中,单击“更新”。
在目标表中,双击要更新的字段。每个字段都显示在查询设计网格的“字段”行中。
如果使用示例表,则添加除“客户 ID”字段之外的所有字段。请注意,目标表的名称显示在设计网格的“表”行中。
在查询的“更新到”行中,在包含目标字段的每一列中,添加源表的名称以及源表中对应于目标表中字段的字段,并确保使用如下语法:[Table].[Field],其中表名称和字段名称用方括号括起来,表名称与字段名称之间用句点分隔。
下图显示了使用示例表的设计网格的一部分。请注意“更新到”行中表名称和字段名称的语法。
在执行操作时,请记住必须在“更新到”行中正确拼写表名称和字段名称,而且任何标点符号都必须与原始表名称和字段名称中的标点符号匹配。但是,大小写不需要匹配。
在“设计”选项卡上的“结果”组中,单击“运行”。
在要求确认更新时,单击“是”。
下表列出了 Access 提供的数据类型,说明了对数据类型转换的限制,并简要描述了转换过程中可能发生的数据丢失现象。
转换为此类型 |
原始类型 |
更改或限制 |
文本 |
备注 |
Access 删除前 255 个字符以外的所有字符。 |
数字 |
无限制。 |
|
日期/时间 |
无限制。 |
|
货币 |
无限制。 |
|
自动编号 |
无限制。 |
|
是/否 |
值 -1(“是/否”字段中的“是”)转换为“是”。值 0(“是/否”字段中的“否”)转换为“否”。 |
|
超链接 |
Access 截断长度超过 255 个字符的链接。 |
|
备注 |
文本 |
无限制。 |
数字 |
无限制。 |
|
日期/时间 |
无限制。 |
|
货币 |
无限制。 |
|
自动编号 |
无限制。 |
|
是/否 |
值 -1(“是/否”字段中的“是”)转换为“是”。值 0(“是/否”字段中的“否”)转换为“否”。 |
|
超链接 |
无限制。 |
|
数字 |
文本 |
文本必须由数字和有效货币以及小数分隔符组成。文本字段中的字符数必须在为数字字段设置的大小范围内。 有关数字字段的大小的详细信息,请参阅插入、创建或删除存储数值的字段一文。 |
备注 |
备注字段只能包含文本和有效货币以及小数分隔符。备注字段中的字符数必须在为数字字段设置的大小范围内。 有关数字字段的大小的详细信息,请参阅插入、创建或删除存储数值的字段一文。 |
|
数字,但具有不同的字段大小或精度 |
值不得大于或小于新字段大小可以存储的值。更改精度可能导致 Access 对某些值进行四舍五入。 |
|
日期/时间 |
可以转换的日期取决于数字字段的大小。请记住,Access 将所有日期存储为序列日期,并将日期值存储为双精度浮点整数。 在 Access 中,1899 年 12 月 30 日是日期 0。在 1899 年 4 月 18 日到 1900 年 9 月 11 日范围以外的日期超出了字节字段的大小。在 1810 年 4 月 13 日到 1989 年 9 月 16 日范围以外的日期超过了整型字段的大小。 若要容纳所有可能的日期,请将数字字段的“字段大小”属性设置为“长整型”或更大值。 有关序列日期以及 Access 如何使用和存储日期值的详细信息,请参阅输入日期或时间值一文。 |
|
货币 |
值不得超过(或小于)为该字段设置的大小限制。例如,只有当值大于 255 但不超过 32,767 时,才能将货币字段转换为整型字段。 |
|
自动编号 |
值必须在为该字段设置的大小限制范围内。 |
|
是/否 |
“是”值转换为 -1。“否”值转换为 0。 |
|
超链接 |
无 |
|
日期/时间 |
文本 |
原始文本必须是可识别的日期或日期/时间组合。例如,2007-01-18。 |
备注 |
原始文本必须是可识别的日期或日期/时间组合。例如,2007-01-18。 |
|
数字 |
值必须在 -657,434 和 2,958,465.99998843 之间。 |
|
货币 |
值必须在 -¥657,434 与 ¥2,958,465.9999 之间。 |
|
自动编号 |
值必须大于 -657,434 但小于 2,958,466。 |
|
是/否 |
值 -1(“是”)转换为 1899 年 12 月 29 日。值 0(“否”)转换为午夜 (12:00 AM)。 |
|
超链接 |
无 |
|
货币 |
文本 |
文本必须由数字和有效分隔符组成。 |
备注 |
文本必须由数字和有效分隔符组成。 |
|
数字 |
无限制。 |
|
日期/时间 |
无限制,但是 Access 可能对值进行四舍五入。 |
|
自动编号 |
无限制。 |
|
是/否 |
值 -1(“是”)转换为 $1,而值 0(“否”)转换为 0$。 |
|
超链接 |
无 |
|
自动编号 |
文本 |
如果“自动编号”字段充当主键,则不允许转换。 |
备注 |
如果“自动编号”字段充当主键,则不允许转换。 |
|
数字 |
如果“自动编号”字段充当主键,则不允许转换。 |
|
日期/时间 |
如果“自动编号”字段充当主键,则不允许转换。 |
|
货币 |
如果“自动编号”字段充当主键,则不允许转换。 |
|
是/否 |
如果“自动编号”字段充当主键,则不允许转换。 |
|
超链接 |
无 |
|
是/否 |
文本 |
原始文本只能由“是”、“否”、“True”、“False”、“开”和“关”组成。 |
备注 |
原始文本只能由“是”、“否”、“True”、“False”、“开”和“关”组成。 |
|
数字 |
零或 Null 转换为“否”,其他所有值转换为“是”。 |
|
日期/时间 |
Null 或 12:00:00 AM 转换为“否”,其他所有值转换为“是”。 |
|
货币 |
零和 Null 转换为“否”,其他所有值转换为“是”。 |
|
自动编号 |
Access 将所有值转换为“是”。 |
|
超链接 |
无 |
|
超链接 |
文本 |
如果原始文本包含有效的 Web 地址,例如,adatum.com、www.adatum.com 或http://www.adatum.com,则 Access 会将文本转换为超链接。Access 将尝试转换其他值,这意味着您会看到带下划线的文本,并且在您指向链接时,光标会发生变化,但链接不工作。文本可以包含任何有效的 Web 协议:http://、gopher://、telnet://、ftp://、wais:// 等等。 |
备注 |
请参阅上一条。适用同样的限制。 |
|
数字 |
如果数字字段是关系的一部分,则不允许转换。如果原始值采用有效的 Internet 协议 (IP) 地址形式(以句点分隔的四组数,每组三个数字:nnn.nnn.nnn.nnn),并且数字恰好与某个 Web 地址一致,则转换将产生一个有效的链接。否则,Access 会在每个值的前面追加 http://,所得到的链接将无效。 |
|
日期/时间 |
Access 会在每个地址前面追加 http://,但所得到的链接几乎永远不会有效。 |
|
货币 |
Access 会在每个值前面追加 http://,但与日期一样,所得到的链接几乎永远不会有效。 |
|
自动编号 |
如果自动编号字段是关系的一部分,则不允许转换。Access 会在每个值前面追加 http://,但所得到的链接几乎永远不会有效。 |
|
是/否 |
Access 将所有“是”值转换为 -1,将所有“否”值转换为 0,并在每个值前面追加 http://。所得到的链接无效。 |