修改表定义或禁用相关视图。
ALTER TABLE [owner.]table-name { alter-clause, ... }
alter-clause : ADD create-clause | ALTER column-name column-alteration | ALTER [ CONSTRAINT constraint-name ] CHECK ( condition ) | DROP drop-object | RENAME rename-object | table-alteration
create-clause : column-name [ AS ] column-data-type [ new-column-attribute ... ] | table-constraint | PCTFREE integer
column-alteration : { column-data-type | alterable-column-attribute } [ alterable-column-attribute ... ] | SET COMPUTE ( compute-expression ) | ADD [ constraint-name ] CHECK ( condition ) | DROP { DEFAULT | COMPUTE | CHECK | CONSTRAINT constraint-name }
drop-object : column-name | CHECK | CONSTRAINT constraint-name | UNIQUE [ CLUSTERED ] ( index-columns-list ) | FOREIGN KEY fkey-name | PRIMARY KEY
rename-object : new-table-name | column-name TO new-column-name | CONSTRAINT constraint-name TO new-constraint-name
table-alteration : PCTFREE DEFAULT | [ NOT ] ENCRYPTED
new-column-attribute : [ NOT ] NULL | DEFAULT default-value | COMPRESSED | INLINE { inline-length | USE DEFAULT } | PREFIX { prefix-length | USE DEFAULT } | [ NO ] INDEX | IDENTITY | COMPUTE ( expression ) | column-constraint
table-constraint : [ CONSTRAINT constraint-name ] { CHECK ( condition ) | UNIQUE [ CLUSTERED | NONCLUSTERED ] ( column-name [ ASC | DESC ], ... ) | PRIMARY KEY [ CLUSTERED | NONCLUSTERED ] ( column-name [ ASC | DESC ], ... ) | foreign-key }
column-constraint : [ CONSTRAINT constraint-name ] { CHECK ( condition ) | UNIQUE [ CLUSTERED | NONCLUSTERED ] [ ASC | DESC ] | PRIMARY KEY [ CLUSTERED | NONCLUSTERED ] [ ASC | DESC ] | REFERENCES table-name [ ( column-name ) ] [ MATCH [ UNIQUE ] { SIMPLE | FULL } ] [ actions ][ CLUSTERED | NONCLUSTERED ] | NOT NULL }
alterable-column-attribute : [ NOT ] NULL | DEFAULT default-value | [ CONSTRAINT constraint-name ] CHECK { NULL | ( condition ) } | [ NOT ] COMPRESSED | INLINE { inline-length | USE DEFAULT } | PREFIX { prefix-length | USE DEFAULT } | [ NO ] INDEX
default-value : special-value | string | global variable | [ - ] number | ( constant-expression ) | ( sequence-expression ) | built-in-function( constant-expression ) | AUTOINCREMENT | GLOBAL AUTOINCREMENT [ ( partition-size ) ]
special-value : CURRENT DATABASE | CURRENT DATE | CURRENT TIME | [ CURRENT ] TIMESTAMP | CURRENT PUBLISHER | CURRENT REMOTE USER | [ CURRENT ] USER | [ CURRENT ] UTC TIMESTAMP | LAST USER | NULL
foreign-key : [ NOT NULL ] FOREIGN KEY [ role-name ] [ ( column-name [ ASC | DESC ], ... ) REFERENCES table-name [ ( pkey-column-list ) ] [ MATCH [ UNIQUE] { SIMPLE | FULL } ] [ actions ] [ CHECK ON COMMIT ] [ CLUSTERED ] [ FOR OLAP WORKLOAD ]
actions : [ ON UPDATE action ] [ ON DELETE action ]
action : CASCADE | SET NULL | SET DEFAULT | RESTRICT
ALTER TABLE [owner.]table-name { DISABLE VIEW DEPENDENCIES }
ALTER TABLE [owner.]table-name ALTER OWNER TO owner [ { PRESERVE | DROP } PRIVILEGES ] [ { PRESERVE | DROP } FOREIGN KEYS ]
ADD column-name [ AS ] column-data-type [ new-column-attribute ...] 子句 此子句用于向表中添加新列、为列指定数据类型和属性。
NULL 和 NOT NULL 子句 此子句用于指定在列中是否允许 NULL。缺省情况下,新列允许使用 NULL 值。创建 BIT 类型列时自动应用 NOT NULL 约束,但您可以将 BIT 类型列声明为可为空值。
DEFAULT 子句 如果指定了 DEFAULT 值,则它将用作未指定列值的任何 INSERT 语句中的列值。如果未指定任何 DEFAULT 值,则它相当于 DEFAULT NULL。
以下列出了 DEFAULT 的可能值:
[ CURRENT ] TIMESTAMP 用于指明表中每行的上次修改时间。当用 DEFAULT TIMESTAMP 声明列时,会提供一个缺省的插入值,每当更新行时,该值都用当前日期和时间更新。
要提供插入时的缺省值,而在每次更新时不改变,请使用 DEFAULT CURRENT TIMESTAMP 而不是 DEFAULT TIMESTAMP。
以 DEFAULT TIMESTAMP 声明的列包含唯一值,以便应用程序能检测到同一行几乎同时发生的更新。如果当前 TIMESTAMP 的值与上一个值相同,它将按 default_timestamp_increment 选项的值相应递增。
在 SQL Anywhere 中,您可以根据 default_timestamp_increment 选项自动截断 TIMESTAMP 值。这对于同其它记录精度较低的时间戳值的数据库软件保持兼容很有用。
全局变量 @@dbts 返回一个 TIMESTAMP 值,该值表示上次使用 DEFAULT TIMESTAMP 为列生成的值。
[ CURRENT ] UTC TIMESTAMP 用于指明表中每行的上次修改时间。当用 DEFAULT UTC TIMESTAMP 声明列时,会提供一个缺省的插入值,每当更新行时,该值都用当前协调通用时间 (UTC) 更新。
要提供缺省的插入值,但在每次更新行时不更新列,请使用 DEFAULT CURRENT UTC TIMESTAMP 而不是 DEFAULT UTC TIMESTAMP。
除了日期和时间以协调通用时间 (UTC) 表示外,此缺省设置的行为与 TIMESTAMP 和 CURRENT TIMESTAMP 相同。
string 请参见字符串。
global-variable 请参见全局变量。
constant-expression 在 DEFAULT 子句中允许使用不引用数据库对象的常量表达式,因此可以使用 GETDATE 或 DATEADD 之类的函数。如果表达式不是函数或简单值,则必须用圆括号将其括起来。
AUTOINCREMENT 使用 AUTOINCREMENT 时,列必须是整型数据类型之一或是精确的数值类型。
插入到表中时,如果没有指定 AUTOINCREMENT 列的值,则生成一个比列中的任何其它值都大的唯一值。如果 INSERT 指定的列值大于列的当前最大值,则插入该值并将其用作后续插入的起点值。
删除行不会相应递减 AUTOINCREMENT 计数器的值。由于删除行而产生的间隙只能由使用插入时的显式赋值填充。显式插入小于该列最大值的列值后,后面没有显式赋值的行仍自动递增为比上一个最大值大 1 的值。
通过检查 @@identity 全局变量,可以找到最近一次插入的列值。
AUTOINCREMENT 值会以有符号的 64 位整数形式保留,对应于 SYSTABCOL 系统视图中 max_identity 列的数据类型。当要生成的下一个值超过可以存储在指派了 AUTOINCREMENT 的列中的最大值时,将返回 NULL。如果此列已声明不允许 NULL(与主键列相同),将生成 SQL 错误。
可以使用 sa_reset_identity 过程重新设置用于列的下一个值。
GLOBAL AUTOINCREMENT 此缺省值专用于在 MobiLink 同步环境或 SQL Remote 复制中使用多个数据库的情况。
此选项类似于 AUTOINCREMENT,只不过要对域进行分区。每个分区都包含相同数目的值。为每个数据库副本指定一个唯一全局数据库标识号。SQL Anywhere 只从用数据库编号唯一标识的分区中提供数据库中的缺省值。
可以在紧跟 AUTOINCREMENT 关键字之后的圆括号内指定分区大小。分区大小可以为任意正整数,但分区大小的选择通常要保证任何一个分区内的编号资源尽量不被用尽(如果曾有过这种情况)。
对于 BIGINT 或 UNSIGNED BIGINT 类型的列,缺省分区大小是 232 = 4294967296;对于所有其它类型的列,缺省分区大小是 216 = 65536。由于这些缺省值可能不合适(尤其当列不是 INT 或 BIGINT 类型时),因此最好显式指定分区大小。
使用此缺省值时,每个数据库中的公共选项 global_database_id 的值必须设置为唯一的非负整数。该值唯一标识数据库,并指示从哪个分区分配缺省值。允许的值范围是 np + 1 到 p(n + 1),其中 n 是公共选项 global_database_id 的值,p 是分区大小。例如,如果将分区大小定义为 1000 并将 global_database_id 设置为 3,则该范围将是 3001 到 4000。
如果上一个值小于 p(n + 1),则下一个缺省值比列中的上一个最大值大 1。如果列不包含任何值,则第一个缺省值为 np + 1。缺省列值不受当前分区之外的列值的影响,即不受小于 np + 1 或大于 p(n + 1) 的数的影响。如果通过 MobiLink 或 SQL Remote 从另一个数据库复制了这种值,就可能存在这种值。
通过检查 @@identity 全局变量,可以找到最近一次插入的列值。
GLOBAL AUTOINCREMENT 值会以有符号的 64 位整数形式保留,对应于 SYSTABCOL 系统视图中 max_identity 列的数据类型。当分区中可以提供的值用完时,将返回 NULL。如果此列已声明不允许 NULL(与主键列相同),将生成 SQL 错误。在这种情况下,应为数据库指派一个新的 global_database_id 值,以便可以从另一个分区中选择缺省值。若要检测提供的未用值是否过小并处理此情况,请创建一个 GlobalAutoincrement 类型的事件。
由于不能将公共选项 global_database_id 设置为负值,因此所选值始终是正数。最大标识号仅受列数据类型和分区大小的限制。
如果将公共选项 global_database_id 设置为缺省值 2147483647,则在列中插入 NULL 值。如果不允许使用 NULL 值,则尝试插入行时将出错。
可以使用 sa_reset_identity 过程重新设置用于列的下一个值。
LAST USER LAST USER 是上次修改行的用户的用户 ID。
LAST USER 可在具有字符数据类型的列中用作缺省值。
在 INSERT 时,此缺省值与 CURRENT USER 的效果相同。
在 UPDATE 时,如果未显式修改具有 LAST USER 缺省值的列,该列会变为当前用户的名称。
与 DEFAULT TIMESTAMP 或 DEFAULT UTC TIMESTAMP 一起使用时,LAST USER 缺省值可用于(在单独的列中)记录上次更改行的用户和日期及时间。
column-constraint 子句 此子句用于向列添加约束。
除 CHECK 约束以外,添加新约束后,数据库服务器会验证现有值以确认它们是否满足约束。仅对表变更完成之后的操作强制实行 CHECK 约束。
可能的列约束包括:
INLINE 和 PREFIX 子句 INLINE 子句用于指定要存储在行中的 BLOB 大小上限(以字节为单位)。小于等于 INLINE 子句所指定值的 BLOB 存储在行内部。超出 INLINE 子句所指定值的 BLOB 将存储在行外部的表扩展页中。另外,当 BLOB 大于 INLINE 值时,BLOB 开头部分某些字节的副本会保留在行中。PREFIX 子句用于指定要保留在行中的字节数。对于需要利用 BLOB 的前缀字节数来确定是接受还是拒绝某行的请求来说,PREFIX 子句可提高这些请求的性能。
压缩列的前缀数据未经压缩存储,因此如果满足请求所需的所有数据都存储在前缀中,则不必进行解压缩。
如果 INLINE 和 PREFIX 都未指定,或指定了 USE DEFAULT,则如下所述应用缺省值:
对于字符数据类型列(例如 CHAR、NCHAR 和 LONG VARCHAR),INLINE 的缺省值为 256,PREFIX 的缺省值为 8。
对于二进制数据类型列(例如 BINARY、LONG BINARY、VARBINARY、BIT、VARBIT、LONG VARBIT、BIT VARYING 和 UUID),INLINE 的缺省值为 256,PREFIX 的缺省值为 0。
强烈建议使用缺省值,除非出现需要另一种设置的特定情况。选择缺省值是为了在性能和磁盘空间要求间取得均衡。例如,如果将 INLINE 设置为较大值,并且所有 BLOB 都被内置存储,则行处理性能可能会下降。如果将 PREFIX 设置得过高,则要增加存储 BLOB 所需的磁盘空间量,因为前缀数据是由 BLOB 的一部分复制而来。
如果仅指定其中一个值,则另一个值会自动设置为不与指定值冲突的最大量。INLINE 和 PREFIX 值均不能超出数据库页面大小。此外,在表页中还要保留少量不可以用于存储行数据的开销。因此,如果指定的 INLINE 值近似于数据库页面大小,可导致要内置存储的字节数稍有减少。
INDEX 和 NO INDEX 子句 存储 BLOB(仅字符或二进制类型)时,指定 INDEX 可对超过内部 BLOB 大小阈值(约八个数据库页)的插入值创建 BLOB 索引。这是缺省行为。
当需要在 BLOB 内进行随机访问搜索时,BLOB 索引可提高性能。但对于某些类型的 BLOB 值(例如永远也不需要随机访问的映像和多媒体文件),关闭 BLOB 索引会提高性能。要关闭某列的 BLOB 索引,请指定 NO INDEX。
BLOB 索引与表索引不同。创建表索引是为了给一个或多个列中的值建立索引。
IDENTITY 子句 IDENTITY 是使用 DEFAULT AUTOINCREMENT 的替代方法,该方法与 Transact-SQL 兼容。在 SQL Anywhere 中,用 IDENTITY 定义的列按 DEFAULT AUTOINCREMENT 执行。
COMPUTE 子句 在使用 COMPUTE 子句创建列时,该列在任何行中的值都是所提供表达式的值。使用此约束创建的列对于应用程序为只读列:只要对行进行了修改,数据库服务器就会更改该值。COMPUTE 表达式不应返回非确定性值。例如,它不应包含特殊值(如 CURRENT TIMESTAMP)或非确定性函数。如果 COMPUTE 表达式返回一个非确定性值,则不能使用它来匹配查询中的表达式。
忽略远程表的 COMPUTE 子句。
任何尝试更改计算列的值的 UPDATE 语句都会触发与该列关联的所有触发器。
ADD table-constraint 子句 此子句用于添加表约束。表约束对表中可保存哪些数据列施加限制。添加或变更表约束时,可选约束名允许您修改或删除个别约束。以下是可添加的表约束列表。
UNIQUE 此次级子句用于指定 column-list 中所指定列的列值必须唯一,或者指定是否使用聚簇索引。
PRIMARY KEY 此次级子句用于添加或变更表的主键,及指定是否使用聚簇索引。表不得具有使用 CREATE TABLE 语句或其它 ALTER TABLE 语句创建的主键。
foreign-key 此次级子句用于将外键作为约束添加。如果对具有相关实例化视图的表执行 ALTER TABLE 语句时使用了除 ADD FOREIGN KEY 之外的次级子句,则 ALTER TABLE 语句会失败。对于所有其它子句,必须禁用相关实例化视图,然后在更改完成后重新启用这些视图。
可以指定 MATCH 次级子句以在使用多列外键时控制将何种情况视为匹配。它还允许您指定键的唯一性,从而免除了另外单独声明唯一性的必要。
ADD PCTFREE 子句 指定希望在每个表页中保留的可用空间的百分比。如果数据更新时行大小增加,将占用可用空间。如果表页中没有可用空间,则该页上的行大小每次增加时,行都需要在多个表页中拆分,从而导致行碎片并可能引起性能下降。如果可用空间百分比为 0,则指定每页不保留可用空间—每页均被完全填充。如果可用空间百分比较高,则每行都单独插入到页中。如果未设置 PCTFREE,或将其删除,则会根据数据库页大小应用缺省 PCTFREE 值(4 KB 及以上页大小应用 200 字节)。PCTFREE 的值存储在系统表 ISYSTAB 中。如果设置了 PCTFREE,所有表页的后续插入都使用新值,但是已插入的行不受影响。在重新设置之前,会持续使用该值。PCTFREE 规范可用于基表、全局临时表或局部临时表。
ALTER column-name column-alteration 子句 此子句用于更改指定列的属性。如果列包含在唯一约束、外键或主键中,则只能更改列的缺省属性。而对于任何其它更改,必须先删除键或约束,然后才能进行修改。
column-data-type 子句 此子句用于变更列的长度或数据类型。如有必要,会将已修改列中的数据转换为新的数据类型。如果发生转换错误,操作将失败,而表则保留不变。不能减小列大小。例如,不能将某列从 VARCHAR(100) 更改为 VARCHAR(50)。
[ NOT ] NULL 子句 此子句用于更改在列中是否允许 NULL。如果指定了 NOT NULL,而在任一现有行中列值为 NULL,则操作将失败,但表保持不变。
CHECK NULL 此子句用于删除列的所有检查约束。
DEFAULT 子句 此子句用于更改列的缺省值。
DEFAULT NULL 子句 此子句用于删除列的缺省值。
[ CONSTRAINT constraint-name ] CHECK { NULL | ( condition ) } 子句 此子句用于在列上添加 CHECK 约束。
如果您需要创建一个涉及到表中两个或更多个列之间关系的 CHECK 约束(例如,A 列必须小于 B 列),可改为定义表约束。
[ NOT ] COMPRESSED 子句 此子句用于更改是否压缩列。
INLINE 和 PREFIX 子句 INLINE 子句用于指定要存储在行中的 BLOB 大小上限(以字节为单位)。小于等于 INLINE 子句所指定值的 BLOB 存储在行内部。超出 INLINE 子句所指定值的 BLOB 将存储在行外部的表扩展页中。另外,当 BLOB 大于 INLINE 值时,BLOB 开头部分某些字节的副本会保留在行中。PREFIX 子句用于指定要保留在行中的字节数。对于需要利用 BLOB 的前缀字节数来确定是接受还是拒绝某行的请求来说,PREFIX 子句可提高这些请求的性能。
压缩列的前缀数据未经压缩存储,因此如果满足请求所需的所有数据都存储在前缀中,则不必进行解压缩。
如果 INLINE 和 PREFIX 都未指定,或指定了 USE DEFAULT,则如下所述应用缺省值:
对于字符数据类型列(例如 CHAR、NCHAR 和 LONG VARCHAR),INLINE 的缺省值为 256,PREFIX 的缺省值为 8。
对于二进制数据类型列(例如 BINARY、LONG BINARY、VARBINARY、BIT、VARBIT、LONG VARBIT、BIT VARYING 和 UUID),INLINE 的缺省值为 256,PREFIX 的缺省值为 0。
强烈建议使用缺省值,除非出现需要另一种设置的特定情况。选择缺省值是为了在性能和磁盘空间要求间取得均衡。例如,如果将 INLINE 设置为较大值,并且所有 BLOB 都被内置存储,则行处理性能可能会下降。如果将 PREFIX 设置得过高,则要增加存储 BLOB 所需的磁盘空间量,因为前缀数据是由 BLOB 的一部分复制而来。
如果仅指定其中一个值,则另一个值会自动设置为不与指定值冲突的最大量。INLINE 和 PREFIX 值均不能超出数据库页面大小。此外,在表页中还要保留少量不可以用于存储行数据的开销。因此,如果指定的 INLINE 值近似于数据库页面大小,可导致要内置存储的字节数稍有减少。
INDEX 和 NO INDEX 子句 存储 BLOB(仅字符或二进制类型)时,指定 INDEX 可对超过内部 BLOB 大小阈值(约八个数据库页)的插入值创建 BLOB 索引。这是缺省行为。
当需要在 BLOB 内进行随机访问搜索时,BLOB 索引可提高性能。但对于某些类型的 BLOB 值(例如永远也不需要随机访问的映像和多媒体文件),关闭 BLOB 索引会提高性能。要关闭某列的 BLOB 索引,请指定 NO INDEX。
BLOB 索引与表索引不同。创建表索引是为了给一个或多个列中的值建立索引。
SET COMPUTE 子句 在使用 COMPUTE 子句创建列时,该列在任何行中的值都是所提供表达式的值。使用此约束创建的列对于应用程序为只读列:只要对行进行了修改,数据库服务器就会更改该值。COMPUTE 表达式不应返回非确定性值。例如,它不应包含特殊值(如 CURRENT TIMESTAMP)或非确定性函数。如果 COMPUTE 表达式返回一个非确定性值,则不能使用它来匹配查询中的表达式。
忽略远程表的 COMPUTE 子句。
任何尝试更改计算列的值的 UPDATE 语句都会触发与该列关联的所有触发器。
ALTER CONSTRAINT constraint-name CHECK 子句 此子句用于变更表的已命名检查约束。
要更改约束以指定表中两个或更多个列之间的关系(例如,A 列必须小于 B 列),请改为定义表约束。
DROP DEFAULT 删除表或指定列的缺省值设置。现有值不发生更改。
DROP COMPUTE 删除指定列的 COMPUTE 属性。此语句不更改表中的任何现有值。
DROP CHECK 删除表或指定列的所有 CHECK 约束。也可以使用 DELETE CHECK。
DROP CONSTRAINT constraint-name 删除表或指定列的已命名约束。也可以使用 DELETE CONSTRAINT。
DROP column-name 从表中删除指定列。也可以使用 DELETE column-name。如果列包含在任何索引、唯一约束、外键或主键中,则必须删除索引、约束或键后才能删除该列。这不会删除引用该列的 CHECK 约束。
DROP UNIQUE ( column-name…… ) 删除指定列上的唯一约束。同时也删除引用此唯一约束的任何外键。也可以使用 DELETE UNIQUE ( column-name ...)。
DROP FOREIGN KEY fkey-name 删除指定的外键。也可以使用 DELETE FOREIGN KEY fkey-name。
DROP PRIMARY KEY 删除主键。同时也删除引用此表主键的所有外键。也可以使用 DELETE PRIMARY KEY。
重命名子句 以下一节介绍用于为列或表的部分定义进行重命名的子句:
RENAME new-table-name 将表名更改为 new-table-name。必要时必须修改任何使用旧表名的应用程序。
RENAME column-name TO new-column-name 将列名更改为 new-column-name。必须对使用旧列名的任何应用程序进行修改。
RENAME CONSTRAINT constraint-name TO new-constraint-name 将约束名更改为 new-constraint-name。
ALTER TABLE...RENAME CONSTRAINT constraint-name TO new-constraint-name,用于 RI 约束时,仅重命名约束,而不重命名基础索引或外键角色名称(如果适用)。要重命名基础索引或角色名称,请使用 ALTER INDEX 语句。
table-alteration 子句 此子句用于变更表的以下属性。
PCTFREE DEFAULT 此子句用于将表的可用百分比设置更改为缺省值(4 KB 及以上页大小时为 200 字节)。
[ NOT ] ENCRYPTED 此子句用于更改是否加密表。要对某个表加密,必须已在数据库中启用表加密。将使用在数据库创建时间所指定的加密密钥和算法来加密表。
对表进行加密之后,加密前的临时文件或事务日志中的此表的任何数据仍以未加密形式存在。为解决这个问题,重新启动数据库将临时文件删除。使用 -o 选项运行备份实用程序 (dbbackup),或使用 BACKUP 语句备份事务日志并启动新事务日志。
启用表加密时,将对加密表的表页、相关联的索引页、临时文件页,以及包含有关加密表的事务的事务日志页加密。
DISABLE VIEW DEPENDENCIES 子句 使用此子句禁用相关常规视图。相关实例化视图不会被禁用;必须通过执行 ALTER MATERIALIZED VIEW...DISABLE 语句来禁用各个相关实例化视图。
必须具有 ALTER ANY OBJECT OWNER 特权。
必须具有以下其中一种特权:表的 ALTER 特权、ALTER ANY TABLE 特权或 ALTER ANY OBJECT 特权。
新的所有者已经无法拥有相同名称的表。
启用的实例化视图无法引用该表。
PRESERVE 或 DROP PRIVILEGES 如果不希望新的所有者拥有与旧所有者相同的特权,则可指定 DROP PRIVILEGES 来删除允许用户访问该表的所有显式授予的特权。隐式授予该表所有者的特权将被授予新的所有者,并从旧的所有者删除这些特权。
PRESERVE 或 DROP FOREIGN KEYS 要防止新的所有者访问被引用表中的数据,可以指定 DROP FOREIGN KEYS 来将表内的所有外键以及引用该表的所有外键删除。
ALTER TABLE 语句可更改现有表中的表属性(列定义、约束等等)。
数据库服务器会在数据库中跟踪对象依赖性。变更表的模式可能会影响相关视图。此外,如果存在依赖于要变更的表的实例化视图,必须先使用 ALTER MATERIALIZED VIEW...DISABLE 语句将其禁用。
对于局部临时表不能使用 ALTER TABLE。
只要 ALTER TABLE 语句影响了当前正由其它连接使用的表,就会禁止该语句。ALTER TABLE 可能很耗时,并且在处理该语句时,数据库服务器不会处理引用表的其它请求。
如果变更在其上构建了定义为 IMMEDIATE REFRESH 文本索引的列,则会立即重建该文本索引。如果文本索引被定义为 AUTO REFRESH 或 MANUAL REFRESH,则会在下次刷新时重建文本索引。
执行 ALTER TABLE 语句后,数据库服务器会尝试恢复对自动重新编译的相关视图的列特权。对于在重新编译过的视图中不再存在的那些列,相应的列特权将会丢失。
ALTER TABLE 要求能够独占访问表。
除非已引用临时表的所有用户都断开了连接,否则无法变更全局临时表。
此语句不能用在快照事务中。
您必须是表的所有者,或者具有以下其中一种特权:
要更改表所有者,还必须具有 ALTER ANY OBJECT OWNER 系统特权。
要创建、更改或删除表的索引,必须分别具有 CREATE ANY INDEX、ALTER ANY INDEX 或 DROP ANY INDEX 系统特权。
自动提交。
在 ALTER TABLE 操作的开始会执行检查点操作,且在 ALTER 操作完成之前会一直挂起其它检查点。
变更列或表之后,引用该变更列的任何存储过程、视图或其它项则不再有效。
如果更改某列已声明的长度或类型,或删除某列,则会删除该列的统计信息。
SQL/2008 ALTER TABLE 是核心功能。SQL/2008 标准中将 ADD COLUMN 和 DROP COLUMN,以及 ADD CONSTRAINT 和 DROP CONSTRAINT 作为核心功能来支持。ALTER [COLUMN] 是 SQL 功能 F381,也是添加、修改或删除列的 DEFAULT 值的能力。在 SQL/2008 中,通过指定 SET DATA TYPE 子句(这是 SQL 语言功能 F382)变更列的数据类型。相反,SQL Anywhere 支持通过直接指定 ALTER 子句修改列的数据类型。
SQL Anywhere 支持的其它子句(包括 ALTER CONSTRAINT、RENAME、PCTFREE、ENCRYPTED 和 DISABLE MATERIALIZED VIEW)是服务商扩充。对列定义的扩充的支持,以及对列和表约束定义的支持是对 SQL/2008 的服务商扩充,或者是 SQL/2008 的特定可选功能。
Transact-SQL Adaptive Server Enterprise 支持 ALTER TABLE。除了支持 ADD CONSTRAINT 和 DROP CONSTRAINT,Adaptive Server Enterprise 还支持 ADD COLUMN 和 DROP COLUMN 子句。对于 ALTER 子句,Adaptive Server Enterprise 使用 MODIFY 关键字,而非使用 ALTER 关键字。Adaptive Server Enterprise 使用 REPLACE 子句变更列的 DEFAULT 值。在 Adaptive Server Enterprise 中,ALTER TABLE 也用于启用/禁用特定表的触发器,这是在 SQL Anywhere 中不支持的功能。
以下示例向 Customers 表添加了新的时间戳列 TimeStamp。要运行下面的语句,必须对 Customers 表具有 ALTER 特权。
ALTER TABLE GROUPO.Customers ADD TimeStamp AS TIMESTAMP DEFAULT TIMESTAMP; |
以下示例删除了在前一个示例中添加的新时间戳列 TimeStamp。
ALTER TABLE GROUPO.Customers DROP TimeStamp; |
Customers 表中的 Street 列目前最多可以保存 35 个字符。要使该列最多可以保存 50 个字符,请执行以下语句:
ALTER TABLE GROUPO.Customers ALTER Street CHAR(50); |
以下示例在 Customers 表中添加一列,该列为每个客户指派一个销售联系人。要运行下面的语句,还必须具有 CREATE ANY INDEX 系统特权,因为其会创建外键。
ALTER TABLE GROUPO.Customers ADD SalesContact INTEGER REFERENCES GROUPO.Employees ( EmployeeID ) ON UPDATE CASCADE ON DELETE SET NULL; |
此外键通过级联更新构造,并在删除时设置为 NULL。如果雇员更改他们的雇员 ID,列将更新以反映这一更改。如果雇员离开公司并且删除了其雇员 ID,则列设置为 NULL。
以下示例在 SalesOrders.SalesRepresentative 列创建了外键 FK_SalesRepresentative_EmployeeID2,并将它链接到 Employees.EmployeeID。您必须对 SalesOrder 表具有 ALTER 特权才能执行以下语句:
ALTER TABLE GROUPO.SalesOrders ADD CONSTRAINT FK_SalesRepresentative_EmployeeID2 FOREIGN KEY ( SalesRepresentative ) REFERENCES GROUPO.Employees (EmployeeID); |
以下示例添加了一个缺省为 AUTOINCREMENT 的列。在此示例中,所有现有客户行均被修改为包含一个分配了列值且允许空值的 AUTOINCREMENT 列,但数据库服务器不确保为各行分配了何种值:
ALTER TABLE GROUPO.Customers ADD Surrogate_key INTEGER DEFAULT AUTOINCREMENT; |
以下示例将虚构表 mytable 的所有者更改为 Bob:
ALTER TABLE mytable ALTER OWNER TO bob; |
![]() |
使用DocCommentXchange讨论此页。
|
版权 © 2013, SAP 股份公司或其关联公司. - SAP Sybase SQL Anywhere 16.0 |