远程Sybase数据库技术支持,联系手机:13811580958,QQ:289965371!

 

随着Sybase被完全整合到SAP下,Sybase原来的支持网站被SAP Support Portal取代。
只有购买了SAP服务的用户才能使用账号登录SAP Support Portal进行介质下载、补丁升级、报Incident等。
目前,原Sybase所有产品(包括:Adaptive Server Enterprise、Sybase IQ、Replication Server、PowerDesigner等)的官方手册仍然可以从http://infocenter.sybase.com/help/index.jsp进行浏览或下载。暂不清楚该网站http://infocenter.sybase.com/help/index.jsp何时会被完全迁移到SAP Support上!
Sybase官方手册英文版有html和pdf两种格式,而中文版手册只有pdf一种格式。为了国内Sybase用户更方便、快捷地搜索Sybase常见产品的官方手册内容,特将中文版Sybase官方手册转为html格式!
Sybase产品官方手册中文版的html格式所有内容的版权归SAP公司所有!本博客站长是Sybase数据库的铁杆粉丝!

如有Sybase数据库技术问题需要咨询,请联系我!

  QQ :289965371 点击这里给我发消息
  Email:

以下官方手册为ASE 15.7 ESD#2中文版:

  1. 新增功能公告 适用于 Windows、Linux 和 UNIX 的 Open Server 15.7 和 SDK 15.7
  2. 新增功能摘要
  3. 新增功能指南
  4. ASE 15.7 发行公告
  5. 配置指南(windows)
  6. 安装指南(windows)
  7. 参考手册:构件块
  8. 参考手册:命令
  9. 参考手册:过程
  10. 参考手册:表
  11. Transact-SQL® 用户指南
  12. 系统管理指南,卷 1
  13. 系统管理指南,卷 2
  14. 性能和调优系列:基础知识
  15. 性能和调优系列:锁定和并发控制
  16. 性能和调优系列:监控表
  17. 性能和调优系列:物理数据库调优
  18. 性能和调优系列:查询处理和抽象计划
  19. 性能和调优系列:使用 sp_sysmon 监控 Adaptive Server
  20. 性能和调优系列:利用统计分析改进性能
  21. 程序员参考 jConnect for JDBC 7.0.7
  22. Adaptive Server Enterprise 中的 Java
  23. 组件集成服务用户指南
  24. Ribo 用户指南
  25. 内存数据库用户指南
  26. Sybase Control Center for Adaptive Server® Enterprise
  27. 安全性管理指南
  28. 实用程序指南

 


< 上一个 | 内容 | 下一步 >

update

说明 通过添加数据或者修改现有数据,更改现有行中的数据。

语法 update [top unsigned_integer] [[database.]owner.]{table_name | view_name}

set [[[database.]owner.]{table_name.|view_name.}]

column_name1 =

{expression1 | NULL | (select_statement)} |

variable_name1 =

{expression1 | NULL | (select_statement)} [, column_name2 =

{expression2 | NULL | (select_statement)}]...| [, variable_name2 =

{expression2 | NULL | (select_statement)}]...


[from [[database.]owner.]{view_name [readpast]|

table_name

[(index {index_name | table_name} [prefetch size][lru|mru])]}

[readpast]

[,[[database.]owner.]{view_name [readpast] | table_name

[(index {index_name | table_name} [prefetch size][lru|mru])]}]

[readpast] ...] [where search_conditions] [plan "abstract plan"]

update [[database.]owner.]{table_name | view_name}

set [[[database.]owner.]{table_name.|view_name.}]

column_name1 =

{expression1 | NULL | (select_statement)} |

variable_name1 =

{expression1 | NULL | (select_statement)} [, column_name2 =

{expression2 | NULL | (select_statement)}]...| [, variable_name2 =

{expression2 | NULL | (select_statement)}]... where current of cursor_name

参数 table_name | view_name 是要更新的表或视图的名称。如果该表或视图位于另一数据库中,请 指定该数据库名称;如果在数据库中有多个具有该名称的表或视图, 请指定所有者的名称。 owner 的缺省值是当前用户,而 database 的缺 省值是当前数据库。

top unsigned_integer

top n 子句紧接在关键字之后插入,并限制更新的行数。


set

指定列名或变量名并赋予其新值。该值可以是表达式或 NULL。列出 多个列名或变量名和值时,必须将其用逗号分隔。

from

使用其它表或视图中的数据修改正在更新的表或视图中的行。

readpast

使 update 命令只修改数据行锁定表上未锁定的行或数据页锁定表上未 锁定页上的行。update...readpast 自动跳过锁定的行或页而不等待锁被 释放。

where

是标准的 where 子句 (请参见 where 子句)。

index {index_name | table_name}

index_name 指定用于访问 table_name 的索引。更新视图时不能使用 此选项。

prefetch size

为绑定到配置了大 I/O 的高速缓存的表指定 I/O 大小 (单位为千字 节)。更新视图时不能使用此选项。 sp_helpcache 显示对象绑定到的 高速缓存或缺省高速缓存的有效大小。若要配置数据高速缓存大小, 请使用 sp_cacheconfigure

在使用 prefetch 并指定预取大小 ( size ) 时,最小值是 2K 或逻辑页大小 与 2 的任意次方的乘积 (最大为 16K)。 prefetch 大小选项如下 (单 位为千字节):


逻辑页大小

预取大小选项

2

2, 4, 8, 16

4

4, 8, 16, 32

8

8, 16, 32, 64

16

16, 32, 64, 128


在查询中指定的 prefetch 大小仅仅是一个建议。要使用指定的大小, 应将数据高速缓存按该大小进行配置。如果未将数据高速缓存配置为 特定的大小,则使用缺省的 prefetch 大小。

如果启用了 CIS,则不能对远程服务器使用 prefetchlru | mru

指定对表使用的缓冲区替换策略。使用 lru 强制优化程序将表读入

MRU/LRU (最近使用最多的/最近使用最少的)链上的高速缓存。使 用 mru 可放弃高速缓存中的缓冲区并将其替换为该表的下一个缓冲 区。更新视图时不能使用此选项。


where current of

导致 Adaptive Server 更新 cursor_name 的当前游标位置指示的表或视 图中的行。

index_name 是要更新的索引的名称。如果未指定索引名,则更新指定表中所有索 引的分布统计信息。

plan "abstract plan" 指定用来优化查询的抽象计划。它可以是用抽象计划语言指定的完整 或部分计划。有关详细信息,请参见 《性能和调优系列:查询处理 和抽象计划》中的 “创建和使用抽象计划”。

示例 示例 1 authors 表中的所有 McBaddens 现在成为 MacBaddens

update authors

set au_lname = "MacBadden" where au_lname = "McBadden"

示例 2 修改 total_sales 列以反映在 sales salesdetail 表中记录的最新销 售。在此假定只在给定日期记录了给定标题的一组销售,且更新是当前 更新:

update titles

set total_sales = total_sales + qty from titles, salesdetail, sales

where titles.title_id = salesdetail.title_id and salesdetail.stor_id = sales.stor_id and salesdetail.ord_num = sales.ord_num and sales.date in

(select max (sales.date) from sales)

示例 3 titles 表中当前由 title_crsr 指向的书的价格更改为 $24.95

update titles

set price = 24.95

where current of title_crsr

示例 4 查找 IDENTITY 列等于 4 的行并将该书的价格更改为 $18.95Adaptive Server IDENTITY 列的名称替换 syb_identity 关键字:

update titles

set price = 18.95 where syb_identity = 4

示例 5 使用一个已声明的变量更新 titles 表:

declare @x money select @x = 0 update titles


set total_sales = total_sales + 1,

@x = price

where title_id = "BU1032"

示例 6 更新另一任务不对其持有锁的行:

update salesdetail set discount = 40 from salesdetail readpast

where title_id like "BU1032" and qty > 100

用法 使用 update 更改已经插入的行中的值。使用 insert 添加新行。

可在一条 update 语句中引用多达 15 个表。

update 与用 create index 命令设置的 ignore_dup_keyignore_dup_row allow_dup_row 选项交互作用。有关详细信息,请参见 create index

可以定义一个触发器,从而在对指定的表或表中指定的列发出

update 命令时执行指定的操作。

Adaptive Server 12.5.2 版之前的版本中,有时不用工作表就能解 析对视图执行的带有 union all 子句的 update delete 查询,这偶尔会 导致不正确的结果。在 Adaptive Server 12.5.2 中,始终使用 tempdb 中的工作表解析带 union all 子句对视图执行 update delete 的查询。

update 语句中使用变量

可在 update 语句的 set 子句中对变量赋值,与在 select 语句中对它们 赋值的方式类似。

update 语句中使用某个变量前,必须用 declare 声明该变量,并用

select 进行初始化 (如示例 5 所示)。

更新中每个限定的行都会进行变量赋值。

update 语句中赋值的右侧引用变量时,该变量的当前值在更新每 行时更改。当前值 是当前行更新之前该变量的值。以下示例说明更 新每行时当前值如何更改。

假设有以下语句:

declare @x int select @x=0 update table1

set C1=C1+@x, @x=@x+1 where column2=xyz

更新开始之前 C1 的值是 1。下表说明 @ x 变量的当前值在每次更新 之后如何更改:




C1 的初始值


@x 的初始值

计算:C1+@x= 更新的 C1

更新后的

C1

计算:@x+1= 更新的

@x


更新值

A

1

0

1+0

1

0+1

1

B

1

1

1+1

2

1+1

2

C

2

2

2+2

4

2+1

3

D

4

3

4+3

7

3+1

4


当在同一 update 语句中提供多个变量赋值时,赋予变量的值可能取 决于它们在赋值列表中的顺序,但并不总是如此。为了获得最佳结 果,请不要依赖于位置来确定所赋的值。

如果返回多行并发生将非集合列赋予某个变量的情况,则该变量的 最终值是处理的最后一行,因此可能没有用。

赋值给变量的 update 语句不需要设置任何限定行的值。

如果没有符合更新的行,则不对变量赋值。

update 语句中赋值的变量不能在同一 update 语句的子查询中引 用,无论该子查询在该 update 语句的何处出现。

update 语句中赋值的变量不能在同一 update 语句的 where

having 子句中引用。

在由连接驱动的更新中,在 update 语句的右侧赋值的变量使用不是 正在更新的表中的列。结果值取决于为更新选择的连接顺序和连接 的表限定的行数。

因为已更新变量的值不是存储在磁盘上,所以更新变量不受 update

语句回退的影响。

对事务使用 update

设置了 chained transaction mode on 且当前没有活动的事务时, Adaptive Server 将隐式地用 update 语句启动事务。若要完成更新,必须 commit 事 务或 rollback 更改。例如:

update stores set city = 'Concord' where stor_id = '7066'

if exists (select t1.city, t2.city from stores t1, stores t2 where t1.city = t2.city

and t1.state = t2.state

and t1.stor_id < t2.stor_id) rollback transaction

else


commit transaction


该批处理启动一个事务 (使用链式事务模式),并更新 stores 表中的某 一行。如果更新与表中另一商店包含相同州和城市信息的行,则将回退 对 stores 表进行的更改并结束该事务。否则,它提交更新并结束事务。

Adaptive Server 允许在给定事务中多次发出更新单个行的 update 语句。 例如,由于其类型 ID 是 “mod_cook”,所以以下两个更新都会影响 title_id MC2022 的书的价格:

begin transaction update titles

set price = price + $10 where title_id = "MC2222" update titles

set price = price * 1.1 where type = "mod_cook"

在更新中使用连接

update from 子句中执行连接是为了更新而对 ANSI 标准的 SQL 语法 所做的 Transact-SQL 扩展。 update 语句的处理方式决定了单个语句进行 的更新不累计。也就是说,如果 update 语句包含一个连接,而此连接中 的另一个表在连接列中有多个匹配值,则第二个更新不基于第一个更新 的新值,而是基于其初始值。结果是不可预知的,因为它们取决于处理 的顺序。考虑以下连接:

update titles set total_sales = total_sales + qty from titles t, salesdetail sd

where t.title_id = sd.title_id

titles 中的每个 title_id、对 salesdetail 的匹配行中的行,total_sales 值 只更新一次。每次的结果可能随查询的连接顺序、表分区或可用索引的 不同而不同。但是每次只从 salesdetail total_sales 添加一个单值。

如果希望返回与连接列匹配的值的总和,则以下使用子查询的查询将返 回正确结果:

update titles set total_sales = total_sales + (select isnull (sum (qty),0)

from salesdetail sd

where t.title_id = sd.title_id) from titles t

对字符数据使用 update

用空字符串 ("") 更新可变长度的字符数据或 text unitext 列会插入 单个空格。固定长度的字符列会填补到定义的长度。


从可变长度列数据中删除所有尾随空格,字符串只包含空格时例 外。仅包含空格的字符串会被截断为单个空格。自动截断比 charncharunicharvarcharunivarchar nvarchar 列指定长度长的字符 串,除非将 string_rtruncation 设置为 on

text unitext 列执行 update 会初始化 text unitext 列,赋予它一 个有效的文本指针,并至少分配一个文本页。

在游标中使用 update

不能更新可滚动游标。

若要更新使用游标的行,请使用 declare cursor 定义游标,然后将其 打开。游标名不能是 Transact-SQL 参数或局部变量。游标必须可更 新,否则 Adaptive Server 将返回错误。对游标结果集进行的任何更 新操作也会影响派生该游标行的基表行。

update ... where current of指定的 table_name view_name必须是在 定义该游标的 select 语句的第一个 from 子句中指定的表或视图。如 果该 from 子句使用连接引用多个表或视图,可仅指定正在被更新的 表或视图。

更新后,游标位置保持不变。只要另一 SQL 语句没有移动该游标的 位置,就可继续更新该游标位置上的行。

• Adaptive Server 允许更新游标的 select_statement 列列表中没有指定 的列,但这些列必须是 select_statement 中指定的表的一部分。但 是,如果用 for update 指定了 column_name_list,且正在声明该游 标,则只能更新那些指定的列。

更新 IDENTITY

不能更新带有 IDENTITY 属性的列,无论是通过其基表更新还是通过视 图更新。若要确定列是否定义有 IDENTITY 属性,请在列的基表上使用 sp_help

选入结果表中的 IDENTITY 列遵循与 IDENTITY 属性的继承性有关的下 列规则:

如果多次选择某一 IDENTITY 列,它将在新表中定义为 NOT NULL。该 IDENTITY 列将不继承 IDENTITY 属性。

如果选择 IDENTITY 列作为表达式的一部分,结果列不会继承 IDENTITY 属性。如果表达式中的任何列允许使用 NULL 值,则将 它创建为 NULL;否则,将它创建为 NOT NULL

如果 select 语句包含 group by 子句或集合函数,结果列不会继承 IDENTITY 属性。包含 IDENTITY 列的集合的列将被创建为 NULL,其它列则被创建为 NOT NULL


通过联合或连接选入表中的 IDENTITY 列不保留 IDENTITY 属性。 如果表中包含 IDENTITY 列和 NULL 列的联合,新列将定义为 NULL。否则,定义为 NOT NULL

通过视图更新数据

不能 update distinct 子句定义的视图。

如果视图是用 with check option 创建的,则通过视图更新的每一行都 必须可以通过视图查看。例如,stores_cal 视图包括 stores 表中 state 值为 “CA”的所有行。with check option 子句根据视图的选择标准检 查每个 update 语句。

create view stores_cal as select * from stores where state = "CA"

with check option

如果将 state 更改为 “CA”之外的值,则 update 语句 (例如下面的 语句)将失败:

update stores_cal set state = "WA"

where store_id = "7066"

如果视图是用 with check option 创建的,则所有从基视图派生的视图 都必须满足视图的选择标准。通过派生 视图更新的每一行都必须能 通过基视图查看。

以从 stores_cal 派生的视图 stores_cal30 为例。此新视图包含位于

California 且付款方式为 “Net 30”的商店的有关信息:

create view stores_cal30 as select * from stores_cal where payterms = "Net 30"

因为 stores_cal 是用 with check option 创建的,所以通过 stores_cal30 更新的所有行都必须可以通过 stores_cal 查看。任何将 state 更改为 “CA”之外的值的行都被拒绝。

请注意,stores_cal30 本身并不具有 with check option 子句。所以,可以 更新 stores_cal30 payterms 值不是 “Net 30”的行。例如,以下 update 语句会成功执行,不过再也无法通过 stores_cal30 查看该行了:

update stores_cal30

set payterms = "Net 60" where stor_id = "7067"

不能在将两个或多个表的列连接起来的视图中更新行,除非下列两 个条件都为真:


该视图没有 with check option 子句,且

所有被更新的列都属于同一基表。

允许对包含 with check option 子句的连接视图执行 update 语句。如果 任何受影响的列出现在 where 子句中,或出现在包含来自多个表的 列的表达式中,更新将会失败。

如果通过连接视图来更新行,所有受影响的列都必须属于同一基表。

使用 indexprefetch lru | mru

indexprefetch lru | mru 可覆盖 Adaptive Server 优化程序作出的选择。 请慎用这些语句,并始终用 set statistics io on 检查性能影响。有关使用这 些选项的详细信息,请参见 《性能和调优指南》。

使用 readpast

readpast 选项只适用于仅数据锁定表。如果为所有页锁定表指定

readpast,则会忽略该选项。

readpast 选项与 holdlock 选项不兼容。如果在同一 select 命令中指定 了两者,将产生错误并终止命令。

如果会话范围的隔离级别为 3,将忽略 readpast 选项。

如果会话的事务隔离级别是 0,使用 readpast update 命令将不会 发出警告消息。对于数据页锁定表,这些命令将修改所有没有被不 兼容锁锁定的所有页中的所有行。对于数据行锁定表,它们影响所 有没有被不兼容锁锁定的行。

如果将带有 readpast 选项的 update 命令应用于两个或多个文本列, 并且检查的第一个文本列含有不兼容锁,则 readpast 锁定将跳过此 行。如果此列没有不兼容锁,则此命令将获取一个锁并修改此列。 然后,如果行中的任何后续文本列带有不兼容锁,则此命令将阻 塞,直到它可以获取锁并修改此列为止。

有关 readpast 的详细信息,请参见 《性能和调优指南》。

标准 符合 ANSI SQL 的级别符合初级标准。 以下是 Transact-SQL 扩展:

使用 from 子句、限定表或列名是可以由 FIPS 标志程序检测的 Transact-SQL 扩展。连接视图的更新或目标列表包含表达式的视图 的更新是直到运行期间才可检测且不可用 FIPS 标志程序进行标志 的 Transact-SQL 扩展。

变量的使用。

readpast


权限 如果 set ansi_permissions on,则需要具有正在更新的表的 update 权 限。此外,必须具有所有在 where 子句中出现的列以及下列 set 子句的 所有列上的 select 权限。缺省情况下, ansi_permissions off

以下说明了基于您的细化权限设置的 update 权限检查。

image

细化权限已启用 在启用细化权限的情况下,你必须是表或者视图的所有者,或是具有 update

权限的用户。

细化权限已禁用 在禁用细化权限的情况下,您必须是表或视图的所有者、具有 update 权限的 用户或具有 sa_role 的用户。


审计 sysaudits event extrainfo 列中的值如下:


事件

审计选项

审计的命令或访问权限

extrainfo 中的信息

70

update

对表执行的 update 命令

角色 – 当前活动角色

关键字或选项 update writetext

先前值 NULL

当前值 NULL

其它信息 NULL

代理信息 set proxy 有效时的初始登录名

71

update

对视图执行的 update 命令

角色 – 当前活动角色

关键字或选项 update writetext

先前值 NULL

当前值 NULL

其它信息 NULL

代理信息 set proxy 有效时的初始登录名

另请参见 命令 alter table, create default, create index, create rule, create trigger, insert, where 子句 .

系统过程 sp_bindefault, sp_bindrule, sp_help, sp_helpartition, sp_helpindex, sp_unbindefault, sp_unbindrule.




--------------------------------------华丽的分割线-------------------------------------------------------------------------
之前就已经研发成功了能够从Sybase SQL Anywhere的DB文件中恢复数据的工具:ReadASADB。
此工具支持ASA v5.0,v6.0,v7.0,v8.0,v9.0,v10.0,v11.0,v12.0等版本。
恢复Sybase SQL Anywhere的工具在国内应该算首创。

ReadASADB功能
能够从损坏的SQL Anywhere数据文件(.db)和UltraLite数据文件(.udb)上提取数据的非常规恢复工具

  1. 适用于所有的SQL Anywhere版本    包括:5.x,6.x,7.x,8.x,9.x,10.x,11.x,12.x
  2. 适用于所有的UltraLite版本
  3. 能够恢复出来表结构和数据
  4. 能够恢复自定义数据类型
  5. 能够恢复存储过程等对象的语法
  6. 能够导出到目标数据库
  7. 能够导出到SQL文件并生成导入脚本
  8. 支持多种字符集  包括:cp850、cp936、gb18030、utf8等
  9. 能够恢复未加密或者简单加密类型的数据
  10. 简单易用
  11. 限制:不支持AES加密的数据文件
请参考:研发成功了从Sybase SQL Anywhere的DB文件上恢复数据的工具
            SQL Anywhere数据库非常规恢复工具ReadASADB使用介绍

ReadASADB适用场景

各种误操作:

  1. 误截断表(truncate table)
  2. 误删除表(drop table)
  3. 错误的where条件误删数据
  4. 误删除db或log文件
  5. 误删除表中的字段

本工具的应用场景:

1.因为物理磁盘故障、操作系统、系统软件方面或者掉电等等原因导致的Sybase SQL Anywhere数据库无法打开的情况;
2.误操作,包括truncate table,drop table,不正确的where条件导致的误删除等;
Sybase SQL Anywhere无法打开时,比较常见的错误是:Assertion failed。
如:
1、Internal database error *** ERROR *** Assertion failed:201819 (8.0.1.2600) Checkpoint log: invalid bitmap page -- transaction rolled back
2、Internal database error *** ERROR *** Assertion failed:201819 (8.0.1.2600) Page number on page does not match page requested -- transaction rolled back
3、Internal database error *** ERROR *** Assertion failed:200502 (9.0.2.2451) Checksum failure on page 23 -- transaction rolled back
4、File is shorter than expected
5、Internal database error *** ERROR *** Assertion failed: 201116 Invalid free list index page found while processing checkpoint log -- transaction rolled back
6、*** ERROR *** Assertion failed: 51901 Page for requested record not a table page or record not present on page等等。
+-------------------------------------华丽的分割线-------------------------------------------------------------------------