修改表定义或禁用相关视图。
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 : 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 ) | built-in-function ( constant-expression ) | AUTOINCREMENT | GLOBAL AUTOINCREMENT [ ( partition-size ) ] | NULL | TIMESTAMP | UTC TIMESTAMP | LAST USER | USER
special-value : CURRENT { DATABASE | DATE | REMOTE USER | TIME | TIMESTAMP | UTC TIMESTAMP | USER | PUBLISHER }
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 }
ADD column-name [ AS ] column-data-type [ new-column-attribute ...] 子句 此子句用于向表中添加新列、为列指定数据类型和属性。有关要指定哪些数据类型的详细信息,请参见SQL 数据类型。
NULL 和 NOT NULL 子句 此子句用于指定在列中是否允许 NULL。除了位类型列以外,新列允许 NULL 值。创建位类型列时自动应用 NOT NULL 约束。
DEFAULT 子句 设置列的缺省值。列中的所有行都以此值填充。有关可能的缺省值的信息,请参见CREATE TABLE 语句。
column-constraint 子句 此子句用于向列添加约束。除 CHECK 约束以外,添加新约束后,数据库服务器会验证现有值以确认它们是否满足约束。仅对表变更完成之后的操作强制实行 CHECK 约束。可能的列约束包括:
PRIMARY KEY 子句 使用此次级子句将某列设为主键,并指定是否使用聚簇索引。有关聚簇索引的详细信息,请参见使用聚簇索引。
REFERENCES 子句 此次级子句用于添加或变更对其它表的引用、指定如何处理匹配项以及指定是否使用聚簇索引。请参见使用聚簇索引。
MATCH 子句 此次级子句可用于在使用多列外键时控制将何种情况视为匹配。它还允许您指定键的唯一性,从而免除了另外单独声明唯一性的必要。有关可以指定的匹配类型的列表,请参见MATCH 子句,CREATE TABLE 语句。
NULL 和 NOT NULL 子句 此子句用于指定在列中是否允许 NULL 值。缺省情况下,允许 NULL 值。
INLINE 和 PREFIX 子句 存储 BLOB(仅字符和二进制数据类型)时,INLINE 和 PREFIX 子句用于指定在行中保留多少 BLOB(以字节为单位)。有关详细信息,请参见CREATE TABLE 语句中的 INLINE 和 PREFIX 子句。
INDEX 和 NO INDEX 子句 此子句用于指定是否在此列中的大 BLOB 上构建索引。有关如何使用此子句的详细信息,请参见CREATE TABLE 语句中 [NO] INDEX 子句的相应部分。
IDENTITY 子句 此子句等效于 AUTOINCREMENT,且实现了与 Transact-SQL 的兼容。请参见CREATE TABLE 语句中对 AUTOINCREMENT 的说明。
COMPUTE 子句 此子句用于确保列中的值反映 expression 的值。有关 COMPUTE 子句允许哪些值的详细信息,请参见CREATE TABLE 语句。
ADD table-constraint 子句 此子句用于添加表约束。表约束对表中可保存哪些数据列施加限制。添加或变更表约束时,可选约束名允许您修改或删除个别约束。以下是可添加的表约束列表。
UNIQUE 此次级子句用于指定 column-list 中所指定列的列值必须唯一,或者指定是否使用聚簇索引。有关此约束的详细信息,请参见CREATE TABLE 语句。
PRIMARY KEY 此次级子句用于添加或变更表的主键,及指定是否使用聚簇索引。表不得具有使用 CREATE TABLE 语句或其它 ALTER TABLE 语句创建的主键。有关此约束的详细信息,请参见CREATE TABLE 语句。
有关聚簇索引的详细信息,请参见使用聚簇索引。
foreign-key 此次级子句用于将外键作为约束添加。如果对具有相关实例化视图的表执行 ALTER TABLE 语句时使用了除 ADD FOREIGN KEY 之外的次级子句,则 ALTER TABLE 语句会失败。对于所有其它子句,必须禁用相关实例化视图,然后在更改完成后重新启用这些视图。
可以指定 MATCH 次级子句以在使用多列外键时控制将何种情况视为匹配。它还允许您指定键的唯一性,从而免除了另外单独声明唯一性的必要。有关可以指定的匹配类型的列表,请参见MATCH 子句,CREATE TABLE 语句。
有关向表添加外键关系的详细信息,请参见CREATE TABLE 语句。
ADD PCTFREE 子句 指定希望在每个表页中保留的可用空间的百分比。如果数据更新时行大小增加,将占用可用空间。如果表页中没有可用空间,则该页上的行大小每次增加时,行都需要在多个表页中拆分,从而导致行碎片并可能引起性能下降。如果可用空间百分比为 0,则指定每页不保留可用空间—每页均被完全填充。如果可用空间百分比较高,则每行都单独插入到页中。如果未设置 PCTFREE,或将其删除,则会根据数据库页大小应用缺省 PCTFREE 值(4 KB 及以上页大小应用 200 字节)。PCTFREE 的值存储在系统表 ISYSTAB 中。如果设置了 PCTFREE,所有表页的后续插入都使用新值,但是已插入的行不受影响。在重新设置之前,会持续使用该值。PCTFREE 规范可用于基表、全局临时表或局部临时表。
ALTER column-name column-alteration 子句 此子句用于更改指定列的属性。如果列包含在唯一约束、外键或主键中,则只能更改列的缺省属性。而对于任何其它更改,必须先删除键或约束,然后才能进行修改。以下是可进行的变更的列表。有关这些属性的详细信息,请参见CREATE TABLE 语句。
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 约束。
[ NOT ] COMPRESSED 子句 此子句用于更改是否压缩列。
INLINE 和 PREFIX 子句 INLINE 和 PREFIX 子句与包含 BLOB 的列一起使用,可以指定在一行中保留多少 BLOB(以字节为单位)。有关如何设置 INLINE 和 PREFIX 值的详细信息,请参见CREATE TABLE 语句中 INLINE 和 PREFIX 子句的相应部分。
INDEX 和 NO INDEX 子句 此子句用于指定是否在此列中的大 BLOB 上构建索引。有关如何使用此子句的详细信息,请参见CREATE TABLE 语句中 [NO] INDEX 子句的相应部分。
SET COMPUTE 子句 此子句用于更改与计算列相关联的表达式。当执行语句时,重新计算列中的值,如果新表达式无效,则语句执行失败。有关 COMPUTE 表达式允许哪些值的详细信息,请参见CREATE TABLE 语句。
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。必要时必须修改任何使用旧表名的应用程序。重命名操作成功执行之后,必须删除并重新创建具有 ON UPDATE 或 ON DELETE 操作的外键,因为用于实现这些操作的系统创建的触发器将继续引用旧名称。
RENAME column-name TO new-column-name 将列名更改为 new-column-name。必要时必须修改任何使用旧列名的应用程序。重命名操作成功执行之后,必须删除并重新创建具有 ON UPDATE 或 ON DELETE 操作的外键,因为用于实现这些操作的系统创建的触发器将继续引用旧名称。
RENAME CONSTRAINT constraint-name TO new-constraint-name 将约束名更改为 new-constraint-name。
ALTER TABLE ... RENAME CONSTRAINT constraint-name TO new-constraint-name,用于 RI 约束时,仅重命名约束,而不重命名基础索引或外键角色名称(如果适用)。如果要重命名基础索引或角色名称,请使用 ALTER INDEX 语句。请参见ALTER INDEX 语句。
变更表子句 此子句用于变更表的以下属性。
PCTFREE DEFAULT 此子句用于将表的可用百分比设置更改为缺省值(4 KB 及以上页大小时为 200 字节)。
[ NOT ] ENCRYPTED 此子句用于更改是否加密表。要对某个表加密,必须已在数据库中启用表加密。将使用在数据库创建时间所指定的加密密钥和算法来加密表。请参见启用数据库中的表加密。对表进行加密之后,加密前的临时文件或事务日志中的此表的任何数据仍以未加密形式存在。为解决这个问题,重新启动数据库将临时文件删除。使用 -o 选项运行备份实用程序 (dbbackup),或使用 BACKUP 语句备份事务日志并启动新事务日志。请参见备份实用程序 (dbbackup)或BACKUP 语句。
启用表加密时,将对加密表的表页、相关联的索引页、临时文件页,以及包含有关加密表的事务的事务日志页加密。
DISABLE VIEW DEPENDENCIES 子句 使用此子句禁用相关常规视图。相关实例化视图不会被禁用;必须通过执行 ALTER MATERIALIZED VIEW ...DISABLE 语句禁用这些视图。请参见ALTER MATERIALIZED VIEW 语句。
ALTER TABLE 语句可更改现有表中的表属性(列定义、约束等等)。
数据库服务器会在数据库中跟踪对象依赖性。变更表的模式可能会影响相关视图。此外,如果存在依赖于要变更的表的实例化视图,必须先使用 ALTER MATERIALIZED VIEW ...DISABLE 语句禁用这些视图。有关视图依赖性的信息,请参见视图依赖性。
对于局部临时表不能使用 ALTER TABLE。
只要 ALTER TABLE 语句影响了当前正由其它连接使用的表,就会禁止该语句。ALTER TABLE 可能很耗时,并且在处理该语句时,数据库服务器不会处理引用表的其它请求。
有关使用 CLUSTERED 选项的详细信息,请参见使用聚簇索引。
如果变更在其上构建了定义为 IMMEDIATE REFRESH 文本索引的列,则会立即重建该文本索引。如果文本索引被定义为 AUTO REFRESH 或 MANUAL REFRESH,则会在下次刷新时重建文本索引。
执行 ALTER TABLE 语句后,数据库服务器会尝试恢复对自动重新编译的相关视图的列权限。对于在重新编译过的视图中不再存在的那些列,相应的列权限将会丢失。
必须是以下之一:
表的所有者。
具有 DBA 权限的用户。
已被授予表的 ALTER 权限的用户。
ALTER TABLE 要求能够独占访问表。
除非已引用临时表的所有用户都断开了连接,否则无法变更全局临时表。
不能用于快照事务内。请参见快照隔离。
自动提交。
在 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。
ALTER TABLE Customers ADD TimeStamp AS TIMESTAMP DEFAULT TIMESTAMP; |
以下示例删除了在前一个示例中添加的新时间戳列 TimeStamp。
ALTER TABLE Customers DROP TimeStamp; |
Customers 表中的 Street 列目前最多可以保存 35 个字符。要使该列最多可以保存 50 个字符,请执行以下语句:
ALTER TABLE Customers ALTER Street CHAR(50); |
以下示例在 Customers 表中添加一列,该列为每个客户指派一个销售联系人。
ALTER TABLE Customers ADD SalesContact INTEGER REFERENCES Employees ( EmployeeID ) ON UPDATE CASCADE ON DELETE SET NULL; |
此外键通过级联更新构造,并在删除时设置为 NULL。如果雇员更改他们的雇员 ID,列将更新以反映这一更改。如果雇员离开公司并且删除了其雇员 ID,则列设置为 NULL。
以下示例在 SalesOrders.SalesRepresentative 列创建了外键 FK_SalesRepresentative_EmployeeID2,并将它链接到 Employees.EmployeeID:
ALTER TABLE GROUPO.SalesOrders ADD CONSTRAINT FK_SalesRepresentative_EmployeeID2 FOREIGN KEY ( SalesRepresentative ) REFERENCES GROUPO.Employees (EmployeeID); |
![]() |
使用DocCommentXchange 讨论此页。
|
版权 © 2010, iAnywhere Solutions, Inc. - SQL Anywhere 12.0.0 |