Click here to view and discuss this page in DocCommentXchange. In the future, you will be sent there automatically.

SQL Anywhere 11.0.1 (中文) » SQL Anywhere 服务器 - SQL 参考 » 使用 SQL » SQL 语句 » SQL 语句 (A-D)

 

ALTER TABLE 语句

此语句用于修改表定义、禁用相关视图或使表能够参与复制服务器复制。

语法
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
| REPLICATE { ON | OFF }
| [ 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
语法 2 - 禁用视图依赖性
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 约束。可能的列约束包括:

      • CHECK 子句   此子句用于为列添加检查条件。

      • UNIQUE 子句   此子句用于指定列中的值必须唯一,并指定创建聚簇索引还是非聚簇索引。

      • PRIMARY KEY 子句   此次级子句用于将某列设为主键,并指定是否使用聚簇索引。有关聚簇索引的详细信息,请参见使用聚簇索引

      • REFERENCES 子句   此次级子句用于添加或变更对其它表的引用、指定如何处理匹配项以及指定是否使用聚簇索引。有关聚簇索引的详细信息,请参见使用聚簇索引

      • NULL 和 NOT NULL 子句   此子句用于指定在列中是否允许 NULL 值。缺省情况下,允许 NULL 值。

    • COMPRESSED 子句   此子句用于压缩列。

    • INLINE 和 PREFIX 子句   存储 BLOB(仅字符和二进制数据类型)时,INLINE 和 PREFIX 子句用于指定在行中保留多少 BLOB(以字节为单位)。有关详细信息,请参见CREATE TABLE 语句中的 INLINE 和 PREFIX 子句。

    • INDEX 和 NO INDEX 子句   此子句用于指定是否在此列中的大 BLOB 上构建索引。有关如何使用此子句的详细信息,请参见CREATE TABLE 语句中 [NO] INDEX 子句的相应部分。

    • IDENTITY 子句   此子句等效于 AUTOINCREMENT,且实现了与 T-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 语句会失败。对于所有其它子句,必须禁用相关实例化视图,然后在更改完成后重新启用这些视图。

        有关此约束的详细信息,请参见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 语句

    • ALTER CONSTRAINT constraint-name CHECK 子句   此子句用于变更表的已命名检查约束。

  • 删除子句   以下一节介绍 DROP 子句:

    • 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

  • 变更表子句   此子句用于变更表的以下属性。

    • PCTFREE DEFAULT   此子句用于将表的可用百分比设置更改为缺省值(4 KB 及以上页大小时为 200 字节)。

    • REPLICATE { ON | OFF }   此子句用于更改在复制期间是否包括表。当表有 REPLICATE ON 时,表的所有更改都发送到复制服务器进行复制。复制服务器中的复制定义用于决定将哪些表更改发送到其它站点。

    • [ 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/2003   ADD COLUMN 是核心特性。其它子句是服务商扩充或对 SQL/2003 特定、已命名扩展的实现。

示例

以下示例向 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);