使用查询更新数据
本文说明如何创建和运行更新查询。在必须更新或更改记录集中的现有数据时,应使用更新查询。
不能使用更新查询来向数据库添加新记录,也不能从数据库中删除整个记录。若要将新记录添加到数据库,请使用追加查询;若要从数据库中删除整个记录,请使用删除查询。有关详细信息,请参阅“请参阅”一节。
注释 不可在 Web 浏览器中运行更新查询。如果要在 Web 数据库中运行更新查询,必须先使用 Access 打开数据库。
本文内容
使用更新查询可以添加、更改或删除一条或多条现有记录中的数据。可以将更新查询视为一种强大的“查找和替换”对话框形式。
与“查找和替换”对话框相似的是,更新查询允许您:
✍ | 指定要替换的值。 |
✍ | 指定要用作替代内容的值。 |
与“查找和替换”对话框不同的是,更新查询允许您:
✍ | 使用与您要替换的值无关的条件。 |
✍ | 一次更新大量记录。 |
✍ | 同时更改多个表中的记录。 |
更新查询不可用于更新以下类型字段中的数据:
✍ | 计算字段 计算字段 (计算字段:在查询中定义的字段,显示表达式的结果而非显示存储的数据。每当表达式中的值改变时,就重新计算一次该值。)中的值不会永久驻留于表中。Access 计算出的值仅存在于计算机的临时内存中。由于计算字段没有永久性存储位置,因此不能更新。 |
✍ | 总计查询或交叉表查询中的字段 这些类型的查询中的值是计算得到的值,因此不能由更新查询更新。 |
✍ | 自动编号字段 按照设计,“自动编号”字段中的值仅在您向表中添加记录时才会更改。 |
✍ | 唯一值查询和唯一记录查询中的字段 这类查询中的值是汇总值。其中某些值表示单条记录,而其他值表示多条记录。由于不可能确定哪些记录被作为重复值而排除,因此无法执行更新操作,也因此无法更新所有必需的字段。不管使用更新查询,还是通过在窗体或数据表中输入值来尝试手动更新数据,此限制都适用。 |
✍ | 联合查询中的字段 不可更新联合查询中的字段内的数据,因为出现在两个或更多数据源中的每条记录只在联合查询结果中出现一次。由于某些重复记录已从结果中移除,因此 Access 无法更新所有必需的记录。 |
✍ | 主键字段 某些情况下,例如,如果在表关系中使用了主键字段,那么,除非先将关系设置为自动级联更新,否则不可使用查询来更新该字段。 |
注释 级联更新时,如果更改父表中的主键值,Access 将自动更新外键值。
作为最佳实践,必须按照两个主要步骤来创建和运行更新查询:创建用于找出您要更新的记录的选择查询,然后将该查询转换为可运行的更新查询来更新记录。
提示 运行更新查询之前,可能需要备份数据库。由于更新查询的结果无法撤消,因此,请进行备份,这可确保在您改变主意时能够撤消更改。
1. | 单击“文件”选项卡,然后单击“共享”。 |
2. | 在右侧的“高级”下面,单击“备份数据库”。 |
3. | 在“备份数据库另存为”对话框中,指定备份副本的名称和位置,然后单击“保存”。 |
Access 将关闭原始文件,创建备份,然后重新打开原始文件。
若要还原到备份,请关闭并重命名原始文件,以便备份副本可以使用原始版本的名称。将原始版本的名称分配给备份副本,然后在 Access 中打开已重命名的备份副本。
本节内容
1. | 打开包含要更新的记录的数据库。 |
2. | 在“设计”选项卡上的“宏和代码”组中,单击“查询设计”。 |
将打开查询设计器,并打开“显示表”对话框。
3. | 单击“表”选项卡。 |
4. | 选择包含要更新的记录的表,单击“添加”,然后单击“关闭”。 |
每个表都会在查询设计器中显示为一个窗口,并且这些窗口会列出每个表中的所有字段。下图显示包含一个典型表的查询设计器。
查询设计器中显示的表
“查询”设计网格
5. | 在表窗口中,双击要更新的字段。所选字段出现在查询设计网格的“字段”行中。 |
可以向查询设计网格中的每一列添加一个表字段。
若要快速添加表中的所有字段,请双击表窗口中表字段列表顶部的星号(“*”)。下图显示添加了所有字段的查询设计网格。
6. | 若要基于字段值限制查询结果,在查询设计网格中的“条件”行中,输入要用来限制结果的条件。 |
注释 该表中的许多示例都使用通配符以使查询更加灵活和高效。
条件 |
效果 |
>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 |
返回包含值的所有记录。 |
"" |
返回包含零长度字符串的所有记录。当您需要向必填字段添加值,但还不知道值是什么时,可以使用零长度字符串。例如,某个字段可能需要传真号码,但某些客户可能没有传真机。在这种情况下,可以输入中间不带空格的一对双引号 ("") 来替代数字。 |
7. | 在“设计”选项卡上的“结果”组中,单击“运行”。 |
8. | 确认查询返回要更新的记录。 |
9. | 若要移除不想包含在查询设计中的任何字段,选择这些字段,然后按 Delete。 |
10. | 若要添加要包含在查询设计中的任何字段,将要添加的字段拖入查询设计网格中。 |
1. | 在“设计”选项卡上的“查询类型”组中,单击“更新”。 |
此过程将演示如何将选择查询更改为更新查询。执行此操作时,Access 会在查询设计网格中添加“更新到”行。下图显示了一个更新查询,该查询返回 2005 年 1 月 5 日之后购买的所有资产,并将所有满足该条件的记录的位置更改为“仓库 3”。
2. | 找到包含要更改的数据的字段,然后在该字段的“更新到”行中键入表达式(更改条件)。 |
可以在“更新到”行中使用任何有效的表达式。
表达式 |
结果 |
"销售人员" |
在文本字段中,将文本值更改为“销售人员”。 |
#8/10/07# |
在日期/时间字段中,将日期值更改为 2007-08-10。 |
是 |
在“是/否”字段中,将值“否”更改为“是”。 |
"PN" & [商品编号] |
将“PN”添加到每个指定商品编号的开头。 |
[单价] * [数量] |
将“单价”和“数量”字段中的值相乘。 |
[运费] * 1.5 |
将“运费”字段中的值增大 50%。 |
DSum("[数量] * [单价]", "订单明细", "[产品ID]=" & [产品ID]) |
如果当前表中的“产品ID”值与“订单明细”表中的“产品ID”值匹配,则该表达式会通过将“数量”字段中的值与“单价”字段中的值相乘来更新销售总额。该表达式使用 DSum 函数,因为它可以对多个表和表字段执行操作。 |
Right([货主邮政编码], 5) |
截断(删除)文本或数字字符串中最左侧的字符,保留最右边的 5 个字符。 |
IIf(IsNull([单价]), 0, [单价]) |
将“单价”字段中的 Null(未知或未定义)值更改为零 (0) 值。 |
3. | 在“设计”选项卡上的“结果”组中,单击“运行”。 |
将显示一条警告消息。
4. | 若要运行查询并更新数据,单击“是”。 |
注释 运行该查询时,您可能会注意到,某些字段未显示在结果集中。如果查询包含您不更新的字段,则默认情况下,Access 不在结果中显示这些字段。例如,您可能包含了两个表中的 ID 字段来帮助确保查询找到并更新正确的记录。如果不更新这些 ID 字段,则 Access 将不在结果中显示这些字段。
在需要将一个表中的数据更新到另一个表时,请考虑下面的规则:源字段和目标字段的数据类型必须匹配或兼容。
此外,在将一个表中的数据更新到另一个表并使用兼容的数据类型替代匹配的数据类型时,Access 会转换目标表中那些字段的数据类型。因此,目标字段中的一些数据可能会被截断(删除)。数据类型转换的限制一节列出了能够以及不能转换数据类型的情况。本节中的该表还说明了在哪些情况下转换数据类型可能更改或清除字段中的部分或全部数据,以及哪些数据可能被清除。
将一个表中的数据更新到另一个表的过程包括下面几个主要步骤:
1. | 创建更新查询并向该查询添加源表和目标表。 |
2. | 在包含相关信息的字段上联接这些表。 |
3. | 将目标字段的名称添加到查询设计网格的“字段”行。 |
4. | 通过使用下面的语法将源字段的名称添加到查询设计网格的“更新到”行:[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 必须能够将源表中的数据转换为目标表可以使用的类型。在某些情况下,转换过程可能删除一些数据。有关转换数据类型的限制的详细信息,请参阅数据类型转换的限制一节。
注释 下面的步骤假设使用上面两个示例表。您可以根据自己的数据对这些步骤进行相应的调整。
1. | 在“设计”选项卡上的“宏和代码”组中,单击“查询设计”。 |
2. | 在“显示表”对话框中,单击“表”选项卡。 |
3. | 双击源表和目标表将其添加到查询,然后单击“关闭”。每个表都将出现在查询设计器的窗口中。 |
4. | 大多数情况下,Access 自动联接查询中的相关字段。若要手动联接包含相关信息的字段,请将相关字段从一个表拖至另一个表的对应字段。 |
例如,如果使用上面显示的两个示例表,则可以将“顾客 ID”字段拖动到“客户 ID”字段。Access 会在两个表中的这两个字段之间创建关系,并使用该关系来联接任何相关记录。
5. | 在“设计”选项卡上的“查询类型”组中,单击“更新”。 |
6. | 在目标表中,双击要更新的字段。每个字段都显示在查询设计网格的“字段”行中。 |
如果使用示例表,则添加除“客户 ID”字段之外的所有字段。请注意,目标表的名称显示在设计网格的“表”行中。
7. | 在查询的“更新到”行中,在包含目标字段的每一列中,添加源表的名称以及源表中对应于目标表中字段的字段,并确保使用如下语法:[表].[字段],其中表名称和字段名称用方括号括起来,表名称与字段名称之间用句点分隔。 |
下图显示了使用示例表的设计网格的一部分。请注意“更新到”行中表名称和字段名称的语法。
在继续执行操作时,请记住,必须在“更新到”行中正确拼写表名称和字段名称,而且任何标点符号都必须与原始表名称和字段名称中的标点符号匹配。但是,大小写不需要匹配。
8. | 在“设计”选项卡上的“结果”组中,单击“运行”。 |
9. | 在要求确认更新时,单击“是”。 |
下表列出了 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 日范围以外的日期超过了整型字段的大小。 若要容纳所有可能的日期,请将数字字段的“字段大小”属性设置为“长整型”或更大值。 |
|
货币 |
值不得超过(或小于)为该字段设置的大小限制。例如,只有当值大于 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 转换为“否”,其他所有值转换为“是”。 |
|
自动编号 |
所有值转换为“是”。 |
|
超链接 |
文本 |
如果原始文本包含有效的网址,例如,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://。所得到的链接无效。 |
如果您尝试运行某个动作查询,但好像没有什么反应,请查看 Access 状态栏中是否显示下列消息:
“此操作或事件已被禁用模式阻止。”
默认情况下,除非您的数据库位于受信任位置,或者数据库已签名并受信任,否则 Access 禁用所有动作查询(更新查询、追加查询、删除查询或生成表查询)。如果没有执行上述任一操作,仍可以通过单击消息栏上的“启用内容”来对当前数据库会话启用查询。
如果习惯使用 SQL,也可以使用 SQL 视图来编写 UPDATE 语句。若要使用 SQL 视图,先创建一个空的新查询,然后切换到 SQL 视图。
本节介绍 UPDATE 语句的语法,并提供示例。
UPDATE table SET newvalue WHERE criteria;
UPDATE 语句包含以下几部分:
部分 |
描述 |
table |
表名,其中包含要修改的数据。 |
newvalue |
表达式,确定将哪些值插入已更新的记录中的特定字段。 |
criteria |
确定将更新哪些记录的表达式。只更新满足表达式条件的记录。 |
如果要更改许多记录,或者要更改的记录位于多个表中,那么 UPDATE 语句尤其有用。
可以同时更改若干字段。以下示例将英国货主的“采购量”值增加 10%,“运费”值增加 3%:
UPDATE Orders
SET OrderAmount = OrderAmount * 1.1,
Freight = Freight * 1.03
WHERE ShipCountry = 'UK';