装sql server 2000中文版;帮助死中文的给你一段<br> Transact-SQL 参考 <br><br> <br>ALTER TABLE<br>通过更改、添加、除去列和约束,或者通过启用或禁用约束和触发器来更改表的定义。<br><br>语法<br>ALTER TABLE table <br>{ [ ALTER COLUMN column_name <br> { new_data_type [ ( precision [ , scale ] ) ]<br> [ COLLATE < collation_name > ]<br> [ NULL | NOT NULL ]<br> | {ADD | DROP } ROWGUIDCOL }<br> ] <br> | ADD<br> { [ < column_definition > ]<br> | column_name AS computed_column_expression<br> } [ ,...n ]<br> | [ WITH CHECK | WITH NOCHECK ] ADD<br> { < table_constraint > } [ ,...n ] <br> | DROP<br> { [ CONSTRAINT ] constraint_name <br> | COLUMN column } [ ,...n ] <br> | { CHECK | NOCHECK } CONSTRAINT<br> { ALL | constraint_name [ ,...n ] }<br> | { ENABLE | DISABLE } TRIGGER<br> { ALL | trigger_name [ ,...n ] } <br>}<br><br>< column_definition > ::=<br> { column_name data_type }<br> [ [ DEFAULT constant_expression ] [ WITH VALUES ]<br> | [ IDENTITY [ ( seed , increment ) [ NOT FOR REPLICATION ] ] ]<br> ] <br> [ ROWGUIDCOL ]<br> [ COLLATE < collation_name > ]<br> [ < column_constraint > ] [ ...n ]<br><br>< column_constraint > ::=<br> [ CONSTRAINT constraint_name ]<br> { [ NULL | NOT NULL ]<br> | [ { PRIMARY KEY | UNIQUE }<br> [ CLUSTERED | NONCLUSTERED ]<br> [ WITH FILLFACTOR = fillfactor ]<br> [ ON { filegroup | DEFAULT } ]<br> ] <br> | [ [ FOREIGN KEY ]<br> REFERENCES ref_table [ ( ref_column ) ]<br> [ ON DELETE { CASCADE | NO ACTION } ]<br> [ ON UPDATE { CASCADE | NO ACTION } ]<br> [ NOT FOR REPLICATION ]<br> ] <br> | CHECK [ NOT FOR REPLICATION ]<br> ( logical_expression ) <br> }<br><br>< table_constraint > ::=<br> [ CONSTRAINT constraint_name ]<br> { [ { PRIMARY KEY | UNIQUE }<br> [ CLUSTERED | NONCLUSTERED ]<br> { ( column [ ,...n ] ) } <br> [ WITH FILLFACTOR = fillfactor ]<br> [ ON { filegroup | DEFAULT } ]<br> ] <br> | FOREIGN KEY<br> [ ( column [ ,...n ] ) ]<br> REFERENCES ref_table [ ( ref_column [ ,...n ] ) ]<br> [ ON DELETE { CASCADE | NO ACTION } ]<br> [ ON UPDATE { CASCADE | NO ACTION } ]<br> [ NOT FOR REPLICATION ]<br> | DEFAULT constant_expression<br> [ FOR column ] [ WITH VALUES ]<br> | CHECK [ NOT FOR REPLICATION ]<br> ( search_conditions ) <br> }<br><br>参数<br>table<br><br>是要更改的表的名称。如果表不在当前数据库中或者不属于当前用户所拥有,可以显式指定数据库和所有者。<br><br>ALTER COLUMN<br><br>指定要更改给定列。如果兼容级别是 65 或小于 65,将不允许使用 ALTER COLUMN。有关更多信息,请参见 sp_dbcmptlevel。 <br><br>要更改的列不能是: <br><br>数据类型为 text、image、ntext 或 timestamp 的列。<br><br><br>表的 ROWGUIDCOL 列。<br><br><br>计算列或用于计算列中的列。<br><br><br>被复制列。<br><br><br>用在索引中的列,除非该列数据类型是 varchar、nvarchar 或 varbinary,数据类型没有更改,而且新列大小等于或者大于旧列大小。<br><br><br>用在由 CREATE STATISTICS 语句创建的统计中的列。首先用 DROP STATISTICS 语句删除统计。由查询优化器自动生成的统计会由 ALTER COLUMN 自动除去。<br><br><br>用在 PRIMARY KEY 或 [FOREIGN KEY] REFERENCES 约束中的列。<br><br><br>用在 CHECK 或 UNIQUE 约束中的列,除非用在 CHECK 或 UNIQUE 约束中的可变长度列的长度允许更改。<br><br><br>有相关联的默认值的列,除非在不更改数据类型的情况下允许更改列的长度、精度或小数位数。 <br>有些数据类型的更改可能导致数据的更改。例如,将数据类型为 nchar 或 nvarchar 的列更改为 char 或 varchar 类型,将导致扩展字符的转换。有关更多信息,请参见 CAST 和 CONVERT。降低列的精度和小数位数可能导致数据截断。<br><br>column_name<br><br>是要更改、添加或除去的列的名称。对于新列,如果数据类型为 timestamp,column_name 可以省略。对于 timestamp 数据类型的列,如果未指定 column_name,将使用名称 timestamp。<br><br>new_data_type<br><br>是要更改的列的新数据类型。要更改的列的 new_data_type 应符合下列准则: <br><br>原来的数据类型必须可以隐式转换为新数据类型。<br><br><br>new_data_type 类型不能为 timestamp。<br><br><br>对 ALTER COLUMN,ANSI 空默认值始终打开;如果没有指定,列将可为空。<br><br><br>对 ALTER COLUMN,ANSI 填充始终打开。<br><br><br>如果要更改的列是标识列,new_data_type 必须是支持标识属性的数据类型。<br><br><br>将忽略 SET ARITHABORT 的当前设置。ALTER TABLE 语句的行为如同 ARITHABORT 选项为 ON 时一样。 <br>precision<br><br>是指定数据类型的精度。有关有效精度值的更多信息,请参见精度、小数位数和长度。 <br><br>scale<br><br>是指定数据类型的小数位数。有关有效小数位数值的更多信息,请参见精度、小数位数和长度。<br><br>COLLATE < collation_name ><br><br>为更改列指定新的排序规则。排序规则名称既可以是 Windows 排序规则名称,也可以是 SQL 排序规则名称。有关列表及更多信息,请参见 Windows 排序规则名称 和 SQL 排序规则名称。<br><br>COLLATE 子句只能用于更改数据类型为 char、varchar、text、nchar、nvarchar 和 ntext 的列的排序规则。如果未指定,则此列采用数据库的默认排序规则。<br><br>若满足下列条件,则 ALTER COLUMN 不能更改排序规则: <br><br>检查约束、外键约束或计算列引用了更改列。 <br><br><br>在此列上创建了索引、统计或全文索引。更改列的排序规则时,该列上自动创建的统计将除去。<br><br><br>SCHEMABOUND 视图或函数引用了此列。 <br>有关 COLLATE 子句的更多信息,请参见 COLLATE。<br><br>NULL | NOT NULL<br><br>指定该列是否可接受空值。不允许空值的列只有在指定了默认值的情况下,才能用 ALTER TABLE 语句向表中添加。添加到表中的新列要么允许空值,要么必须指定默认值。<br><br>如果新列允许空值,而且没有指定默认值,那么新列在表中每一行都包含空值。如果新列允许空值并且指定了新列的默认值,那么可以使用 WITH VALUES 选项在表中所有现有行的新列中存储默认值。<br><br>如果新列不允许空值,那么新列必须具有 DEFAULT 定义,而且新列的所有现有行中将自动装载该默认值。<br><br>可在 ALTER COLUMN 语句中指定 NULL 以使 NOT NULL 列允许空值,但 PRIMARY KEY 约束中的列除外。只有列中不包含空值时,ALTER COLUMN 中才可指定 NOT NULL。必须将空值更新为非空值后,才允许执行 ALTER COLUMN NOT NULL 语句,比如:<br><br>UPDATE MyTable SET NullCol = N'some_value' WHERE NullCol IS NULL<br><br>ALTER TABLE MyTable ALTER COLUMN NullCOl NVARCHAR(20) NOT NULL<br><br>如果 ALTER COLUMN 中指定了 NULL 或 NOT NULL,那么必须同时指定 new_data_type [(precision [, scale ])]。如果不更改数据类型、精度和小数位数,请指定列的这些值的当前值。<br><br>[ {ADD | DROP} ROWGUIDCOL ]<br><br>指定在指定列上添加或除去 ROWGUIDCOL 属性。ROWGUIDCOL 是一个关键字,表示列是行全局唯一标识符列。对于每个表只能指派一个 uniqueidentifier 列作为 ROWGUIDCOL 列。ROWGUIDCOL 属性只能指派给 uniqueidentifier 列。<br><br>ROWGUIDCOL 属性并不强制列中所存储值的唯一性。该属性也不会为插入到表中的新行自动生成值。若要为每列生成唯一值,那么或者在 INSERT 语句中使用 NEWID 函数,或者将 NEWID 函数指定为该列的默认值。<br><br>ADD<br><br>指定要添加一个或多个列定义、计算列定义或者表约束。<br><br>computed_column_expression<br><br>是一个定义计算列的值的表达式。计算列是并不物理地存储在表中的虚拟列,该列用表达式计算得出,该表达式使用同一表中的其它列。例如,计算列的定义可以是:cost AS price * qty。表达式可以是非计算列的列名、常量、函数、变量,也可以是用一个或多个运算符连接的上述元素的任意组合。表达式不能为子查询。<br><br>计算列可用于选择列表、WHERE 子句、ORDER BY 字句或其它任何可以使用常规表达式的位置,但下列情况除外: <br><br>计算列不能用作 DEFAULT 或 FOREIGN KEY 约束定义,也不能与 NOT NULL 约束定义一起使用。但是,如果计算列由具有确定性的表达式定义,并且索引列中允许计算结果的数据类型,则可将该列用作索引中的键列,或用作 PRIMARY KEY 或 UNIQUE 约束的一部分。 <br>例如,如果表中有整数列 a 和 b,那么计算列 a+b 上可建立索引,而计算列 a+DATEPART(dd, GETDATE()) 上则不能,因为该值将在后续调用时更改。<br><br>计算列不能作为 INSERT 或 UPDATE 语句的目标。 <br><br><br>说明 由于表中计算列所用列中的各行可能有不同的值,所以计算列的每一行可能有不同的值。<br><br>n<br><br>是表示前面的项可重复 n 次的占位符。<br><br>WITH CHECK | WITH NOCHECK<br><br>指定表中的数据是否用新添加的或重新启用的 FOREIGN KEY 或 CHECK 约束进行验证。如果没有指定,对于新约束,假定为 WITH CHECK,对于重新启用的约束,假定为 WITH NOCHECK。<br><br>WITH CHECK 和 WITH NOCHECK 子句不能用于 PRIMARY KEY 和 UNIQUE 约束。<br><br>如果不想用新 CHECK 或 FOREIGN KEY 约束对现有数据进行验证,请用 WITH NOCHECK,除了个别情况,不建议这样使用。新约束将在以后的所有更新中生效。任何在添加约束时由 WITH NOCHECK 抑制的约束违规都可能导致将来的更新失败,如果这些更新操作要更新的行中包含不符合约束条件的数据。<br><br>查询优化器不考虑用 WITH NOCHECK 定义的约束。将忽略这些约束,直到使用 ALTER TABLE table CHECK CONSTRAINT ALL语句重新启用这些约束为止。<br><br>DROP { [CONSTRAINT] constraint_name | COLUMN column_name }<br><br>指定从表中删除 constraint_name 或者 column_name。如果兼容级别小于或等于 65,将不允许 DROP COLUMN。可以列出多个列或约束。下面的列不能除去: <br><br>被复制列。<br><br><br>用在索引中的列。<br><br><br>用在 CHECK、FOREIGN KEY、UNIQUE 或 PRIMARY KEY 约束中的列。<br><br><br>有相关联的默认值(由 DEFAULT 关键字定义)的列,或绑定到默认对象的列。<br><br><br>绑定到规则的列。 <br>{ CHECK | NOCHECK} CONSTRAINT<br><br>指定启用或禁用 constraint_name。如果禁用,将来插入或更新该列时将不用该约束条件进行验证。此选项只能与 FOREIGN KEY 和 CHECK 约束一起使用。 <br><br>ALL <br>指定使用 NOCHECK 选项禁用所有约束,或者使用 CHECK 选项启用所有约束。 <br>{ENABLE | DISABLE} TRIGGER<br><br>指定启用或禁用 trigger_name。当一个触发器被禁用时,它对表的定义依然存在;然而,当在表上执行 INSERT、UPDATE 或 DELETE 语句时,触发器中的操作将不执行,除非重新启用该触发器。 <br><br>ALL <br>指定启用或禁用表中所有的触发器。<br><br>trigger_name <br>指定要启用或禁用的触发器名称。 <br>column_name data_type<br><br>新列的数据类型。data_type 可以是任何 Microsoft&reg; SQL Server&#8482; 数据类型或用户定义数据类型。<br><br>DEFAULT<br><br>是指定列默认值的关键字。DEFAULT 定义可用于为表中现有行的新列提供值。DEFAULT 定义不能添加到具有 timestamp 数据类型、IDENTITY 属性、现有 DEFAULT 定义或绑定默认值的列。如果列已有默认值,必须除去旧默认值后才能添加新默认值。为同 SQL Server 先前版本保持兼容性,向 DEFAULT 赋予约束名是可能的。<br><br>IDENTITY<br><br>指定新列是标识列。在表中添加新行时,SQL Server 为列提供一个唯一的增量值。标识列通常与 PRIMARY KEY 约束一起用作表的唯一行标识符。IDENTITY 属性可赋予 tinyint、smallint、int、bigint、decimal(p,0) 或者 numeric(p,0) 列。对于每个表只能创建一个标识列。DEFAULT 关键字和绑定默认值不能用于标识列。要么种子和增量都同时指定,要么都不指定。如果二者都未指定,则取默认值 (1,1)。 <br><br>Seed <br>是用于表中所装载的第一行的值。<br><br>Increment <br>是添加到前一行的标识值的增量值。 <br>NOT FOR REPLICATION<br><br>指定当复制登录(如 sqlrepl)向表中插入数据时,不强制 IDENTITY 属性。也可对约束指定 NOT FOR REPLICATION。当复制登录向表中插入数据时,不检查约束条件。<br><br>CONSTRAINT<br><br>指定 PRIMARY KEY、UNIQUE、FOREIGN KEY 或 CHECK 约束的开始,或者指定 DEFAULT 定义的开始。<br><br>constrain_name<br><br>是新约束。约束的名称必须符合标识符规则,但其名称的首字符不能为 #。如果没有提供 constraint_name,约束使用系统生成的名称。<br><br>PRIMARY KEY<br><br>是通过唯一索引对给定的一列或多列强制实体完整性的约束。对每个表只能创建一个 PRIMARY KEY 约束。<br><br>UNIQUE<br><br>是通过唯一索引为给定的一列或多列提供实体完整性的约束。<br><br>CLUSTERED | NONCLUSTERED<br><br>指定为 PRIMARY KEY 或 UNIQUE 约束创建聚集或非聚集索引。PRIMARY KEY 约束默认为 CLUSTERED;UNIQUE 约束默认为 NONCLUSTERED。<br><br>如果表中已存在聚集约束或索引,那么在 ALTER TABLE 中就不能指定 CLUSTERED。如果表中已存在聚集约束或索引,PRIMARY KEY 约束默认为 NONCLUSTERED。<br><br>WITH FILLFACTOR = fillfactor<br><br>指定 SQL Server 存储索引数据时每个索引页的充满程度。用户指定的 fillfactor 取值范围从 1 到 100。如果没有指定,那么默认值为 0。创建索引时,fillfactor 值越低,不必分配新空间即可添加的新索引条目的可用空间就越多。有关详细信息,请参见 CREATE INDEX。 <br><br>ON {filegroup | DEFAULT}<br><br>指定为约束创建的索引的存储位置。如果指定了 filegroup,索引将在该文件组内创建。如果指定了 DEFAULT,索引将在默认文件组内创建。如果未指定 ON,索引将在表所在的文件组内创建。当为 PRIMARY KEY 或 UNIQUE 约束添加聚集索引时,如果指定了 ON,那么创建聚集索引时整个表都将移到指定的文件组中。<br><br>在这里,DEFAULT 不是一个关键字。DEFAULT 是默认文件组的标识符,必须用符号界定,如 ON "DEFAULT" 或 ON [DEFAULT]。<br><br>FOREIGN KEY...REFERENCES<br><br>是为列中数据提供引用完整性的约束。FOREIGN KEY 约束要求列中的每个值在被引用表的指定列中都存在。<br><br>ref_table<br><br>是 FOREIGN KEY 约束所引用的表。<br><br>ref_column<br><br>是新 FOREIGN KEY 约束所引用的一列或多列(置于括号中)。<br><br>ON DELETE {CASCADE | NO ACTION}<br><br>指定当表中被更改的行具有引用关系,并且该行所引用的行从父表中删除时,要对被更改行采取的操作。默认设置为 NO ACTION。 <br><br>如果指定 CASCADE,则从父表中删除被引用行时,也将从引用表中删除引用行。如果指定 NO ACTION,SQL Server 将产生一个错误并回滚父表中的行删除操作。<br><br>如果表中已存在 ON DELETE 的 INSTEAD OF 触发器,那么就不能定义 ON DELETE 的CASCADE 操作。<br><br>例如,在 Northwind 数据库中,Orders 表和 Customers 表之间有引用关系。Orders.CustomerID 外键引用 Customers.CustomerID 主键。<br><br>如果对 Customers 表的某行执行 DELETE 语句,并且为 Orders.CustomerID 指定 ON DELETE CASCADE 操作,则 SQL Server 将在 Orders 表中检查是否有与被删除的行相关的一行或多行。如果存在相关行,那么 Orders 表中的相关行将随 Customers 表中的被引用行一同删除。<br><br>反之,如果指定 NO ACTION,若在 Orders 表中至少有一行引用 Customers 表中要删除的行,则 SQL Server 将产生一个错误并回滚 Customers 表中的删除操作。<br><br>ON UPDATE {CASCADE | NO ACTION}<br><br>指定当表中被更改的行具有引用关系,并且该行所引用的行在父表中更新时,要对被更改行采取的操作。默认设置为 NO ACTION。 <br><br>如果指定 CASCADE,则在父表中更新被引用行时,也将在引用表中更新引用行。如果指定 NO ACTION,SQL Server 将产生一个错误并回滚父表中的行更新操作。<br><br>如果表中已存在 ON DELETE 的 INSTEAD OF 触发器,那么就不能定义 ON DELETE 的CASCADE 操作。<br><br>例如,在 Northwind 数据库中,Orders 表和 Customers 表之间有引用关系。Orders.CustomerID 外键引用 Customers.CustomerID 主键。<br><br>如果对 Customers 表的某行执行 UPDATE 语句,并且为 Orders.CustomerID 指定 ON UPDATE CASCADE 操作,则 SQL Server 将在 Orders 表中检查是否有与被更新行相关的一行或多行。如果存在相关行,那么 Orders 表中的相关行将随 Customers 表中的被引用行一同更新。<br><br>反之,如果指定了 NO ACTION,若在 Orders 表中至少存在一行引用 Customers 表中要更新的行,那么 SQL Server 将引发一个错误并回滚 Customers 表中的更新操作。<br><br>[ASC | DESC]<br><br>指定加入到表约束中的一列或多列的排序次序。默认设置为 ASC。<br><br>WITH VALUES<br><br>指定在添加到现有行的新列中存储 DEFAULT constant_expression 中所给定的值。只有在 ADD 列子句中指定了 DEFAULT 的情况下,才能使用 WITH VALUES。如果要添加的列允许空值且指定了 WITH VALUES,那么将在现有行的新列中存储默认值。如果没有指定 WITH VALUES 且列允许空值,那么将在现有行的新列中存储 NULL 值。如果新列不允许空值,那么不论是否指定 WITH VALUES,都将在现有行的新列中存储默认值。<br><br>column[,...n]<br><br>是新约束所用的一列或多列(置于括号中)。<br><br>constant_expression<br><br>是用作列的默认值的字面值、NULL 或者系统函数。<br><br>FOR column<br><br>指定与表级 DEFAULT 定义相关联的列。<br><br>CHECK<br><br>是通过限制可输入到一列或多列中的可能值强制域完整性的约束。<br><br>logical_expression<br><br>是用于 CHECK 约束的返回 TRUE 或 FALSE 的逻辑表达式。用于 CHECK 约束的 Logical_expression 不能引用其它表,但可引用同一表中同一行的其它列。<br><br>注释<br>若要添加新数据行,请使用 INSERT 语句。若要删除数据行,请使用 DELETE 或 TRUNCATE TABLE 语句。若要更改现有行中的值,请使用 UPDATE 语句。<br><br>ALTER TABLE 语句指定的更改将立即实现。如果这些更改需要修改表中的行,ALTER TABLE 将更新这些行。ALTER TABLE 将获取表上的架构修改锁,以确保在更改期间其它连接不能引用该表(甚至不能引用其元数据)。对表进行的更改将记录于日志中,并且可以完全恢复。影响非常大的表中所有行的更改,比如除去一列或者用默认值添加 NOT NULL 列,可能需要较长时间才能完成,并会生成大量日志记录。如同影响大量行的 INSERT、UPDATE 或者 DELETE 语句一样,这一类 ALTER TABLE 语句也应小心使用。<br><br>如果过程高速缓存中存在引用该表的执行计划,ALTER TABLE 会将这些执行计划标记为下次执行时重新编译。<br><br>如果 ALTER TABLE 语句指定更改其它表所引用的列值,那么根据引用表中 ON UPDATE 或者 ON DELETE 所指定的操作,将发生以下两个事件之一。 <br><br>如果在引用表中没有指定值或指定了 NO ACTION(默认值),那么 ALTER TABLE 语句导致的更改父表中被引用列的操作将回滚,并且 SQL Server 将引发一个错误。<br><br><br>如果在引用表中指定了 CASCADE,那么由 ALTER TABLE 语句导致的对父表的更改将应用于父表及其相关表。 <br>添加 sql_variant 列的 ALTER TABLE 语句会生成下列警告:<br><br>The total row size (xx) for table 'yy' exceeds the maximum number of bytes per row (8060). Rows that exceed the maximum number of bytes will not be added.<br>因为 sql_variant 的最大长度为 8016 个字节,所以产生该警告。当某 sql_variant 列所含值接近最大长度时,即会超过行长度的最大字节限制。<br><br>ALTER TABLE 语句对具有架构绑定视图的表执行时,所受限制与当前在更改具有简单索引的表时所受的限制相同。添加列是允许的。但是,不允许删除或更改参与架构绑定视图的表中的列。如果 ALTER TABLE 语句要求更改用在架构绑定视图中的列,更改操作将失败,并且 SQL Server 将引发一条错误信息。有关 SCHEMABINDING 和索引视图的更多信息,请参见 CREATE VIEW。<br><br>创建引用表的架构绑定视图不会影响在基表上添加或删除触发器。<br><br>当除去约束时,作为约束的一部分而创建的索引也将除去。而通过 CREATE INDEX 创建的索引必须使用 DROP INDEX 语句来除去。DBCC DBREINDEX 语句可用来重建约束定义的索引部分;而不必使用 ALTER TABLE 先除去再重新添加约束。<br><br>必须删除所有基于列的索引和约束后,才能删除列。<br><br>添加约束时,所有现有数据都要进行约束违规验证。如果发生违规,ALTER TABLE 语句将失败并返回一个错误。<br><br>当在现有列上添加新 PRIMARY KEY 或 UNIQUE 约束时,该列中的数据必须唯一。如果存在重复值,ALTER TABLE 语句将失败。当添加 PRIMARY KEY 或 UNIQUE 约束时,WITH NOCHECK 选项不起作用。<br><br>每个 PRIMARY KEY 和 UNIQUE 约束都将生成一个索引。UNIQUE 和 PRIMARY KEY 约束的数目不能导致表上非聚集索引的数目大于 249,聚集索引的数目大于 1。<br><br>如果要添加的列的数据类型为 uniqueidentifier,那么该列可以使用 NEWID() 函数作为默认值,以向表中现有行的新列提供唯一标识符值。<br><br>SQL Server 在列定义中并不强制以特定的顺序指定 DEFAULT、IDENTITY、ROWGUIDCOL 或列约束。<br><br>ALTER TABLE 的 ALTER COLUMN 子句并不会在列上绑定或取消绑定任何规则。必须分别使用 sp_bindrule 或 sp_unbindrule 来绑定或取消绑定规则。<br><br>可将规则绑定到用户定义数据类型。然后 CREATE TABLE 将自动在以该用户定义数据类型定义的列上绑定该规则。当用 ALTER COLUMN 更改列数据类型时,并不会取消绑定这些规则。原用户定义数据类型上的规则仍然绑定在该列上。在 ALTER COLUMN 更改了列的数据类型之后,随后执行的任何从该用户定义数据类型上取消绑定规则的 sp_unbindrule 都不会导致从更改了数据类型的列上取消绑定该规则。如果 ALTER COLUMN 将列的数据类型更改为绑定了规则的用户定义数据类型,那么绑定到新数据类型的规则不会绑定到该列。<br><br>权限<br>ALTER TABLE 权限默认授予表的所有者、sysadmin 固定服务器角色成员、db_owner 和 db_ddladmin 固定数据库角色成员且不可转让。<br><br>示例<br>A. 更改表以添加新列<br>下例添加一个允许空值的列,而且没有通过 DEFAULT 定义提供值。各行的新列中的值将为 NULL。<br><br>CREATE TABLE doc_exa ( column_a INT) <br>GO<br>ALTER TABLE doc_exa ADD column_b VARCHAR(20) NULL<br>GO<br>EXEC sp_help doc_exa<br>GO<br>DROP TABLE doc_exa<br>GO<br><br>B. 更改表以除去列<br>下例修改表以删除一列。<br><br>CREATE TABLE doc_exb ( column_a INT, column_b VARCHAR(20) NULL) <br>GO<br>ALTER TABLE doc_exb DROP COLUMN column_b<br>GO<br>EXEC sp_help doc_exb<br>GO<br>DROP TABLE doc_exb<br>GO<br><br>C. 更改表以添加具有约束的列<br>下例向表中添加具有 UNIQUE 约束的新列。 <br><br>CREATE TABLE doc_exc ( column_a INT) <br>GO<br>ALTER TABLE doc_exc ADD column_b VARCHAR(20) NULL <br> CONSTRAINT exb_unique UNIQUE<br>GO<br>EXEC sp_help doc_exc<br>GO<br>DROP TABLE doc_exc<br>GO<br><br>D. 更改表以添加未验证的约束<br>下例向表中的现有列上添加约束。该列中存在一个违反约束的值;因此,利用 WITH NOCHECK 来防止对现有行验证约束,从而允许该约束的添加。<br><br>CREATE TABLE doc_exd ( column_a INT) <br>GO<br>INSERT INTO doc_exd VALUES (-1)<br>GO<br>ALTER TABLE doc_exd WITH NOCHECK <br>ADD CONSTRAINT exd_check CHECK (column_a > 1)<br>GO<br>EXEC sp_help doc_exd<br>GO<br>DROP TABLE doc_exd<br>GO<br><br>E. 更改表以添加多个带有约束的列<br>下例向表中添加多个带有约束的新列。第一个新列具有 IDENTITY 属性;表中每一行的标识列都将具有递增的新值。<br><br>CREATE TABLE doc_exe ( column_a INT CONSTRAINT column_a_un UNIQUE) <br>GO<br>ALTER TABLE doc_exe ADD <br><br>/* Add a PRIMARY KEY identity column. */ <br>column_b INT IDENTITY<br>CONSTRAINT column_b_pk PRIMARY KEY, <br><br>/* Add a column referencing another column in the same table. */ <br>column_c INT NULL <br>CONSTRAINT column_c_fk <br>REFERENCES doc_exe(column_a),<br><br>/* Add a column with a constraint to enforce that */ <br>/* nonnull data is in a valid phone number format. */<br>column_d VARCHAR(16) NULL <br>CONSTRAINT column_d_chk<br>CHECK <br>(column_d IS NULL OR <br>column_d LIKE "[0-9][0-9][0-9]-[0-9][0-9][0-9][0-9]" OR<br>column_d LIKE<br>"([0-9][0-9][0-9]) [0-9][0-9][0-9]-[0-9][0-9][0-9][0-9]"),<br><br>/* Add a nonnull column with a default. */ <br>column_e DECIMAL(3,3)<br>CONSTRAINT column_e_default<br>DEFAULT .081<br>GO<br>EXEC sp_help doc_exe<br>GO<br>DROP TABLE doc_exe<br>GO<br><br>F. 添加具有默认值的可为空的列<br>下例添加可为空的、具有 DEFAULT 定义的列,并使用 WITH VALUES 为表中的各现有行提供值。如果没有使用 WITH VALUES,那么每一行的新列中都将具有 NULL 值。<br><br>ALTER TABLE MyTable <br>ADD AddDate smalldatetime NULL<br>CONSTRAINT AddDateDflt<br>DEFAULT getdate() WITH VALUES<br><br>G. 禁用并重新启用一个约束<br>下例禁用用于限制可接受的薪水数据的约束。WITH NOCHECK CONSTRAINT 与 ALTER TABLE 一起使用,以禁用该约束并使正常情况下会引起约束违规的插入操作得以执行。WITH CHECK CONSTRAINT 重新启用该约束。<br><br>CREATE TABLE cnst_example <br>(id INT NOT NULL,<br> name VARCHAR(10) NOT NULL,<br> salary MONEY NOT NULL<br> CONSTRAINT salary_cap CHECK (salary < 100000)<br>)<br><br>-- Valid inserts<br>INSERT INTO cnst_example VALUES (1,"Joe Brown",65000)<br>INSERT INTO cnst_example VALUES (2,"Mary Smith",75000)<br><br>-- This insert violates the constraint.<br>INSERT INTO cnst_example VALUES (3,"Pat Jones",105000)<br><br>-- Disable the constraint and try again.<br>ALTER TABLE cnst_example NOCHECK CONSTRAINT salary_cap<br>INSERT INTO cnst_example VALUES (3,"Pat Jones",105000)<br><br>-- Reenable the constraint and try another insert, will fail.<br>ALTER TABLE cnst_example CHECK CONSTRAINT salary_cap<br>INSERT INTO cnst_example VALUES (4,"Eric James",110000)<br><br>H. 禁用并重新启用触发器<br>下例使用 ALTER TABLE 的 DISABLE TRIGGER 选项来禁用触发器,以使正常情况下会违反触发器条件的插入操作得以执行。然后下例使用 ENABLE TRIGGER 重新启用触发器。<br><br>CREATE TABLE trig_example <br>(id INT, <br>name VARCHAR(10),<br>salary MONEY)<br>go<br>-- Create the trigger.<br>CREATE TRIGGER trig1 ON trig_example FOR INSERT<br>as <br>IF (SELECT COUNT(*) FROM INSERTED<br>WHERE salary > 100000) > 0<br>BEGIN<br>print "TRIG1 Error: you attempted to insert a salary > $100,000"<br>ROLLBACK TRANSACTION<br>END<br>GO<br>-- Attempt an insert that violates the trigger.<br>INSERT INTO trig_example VALUES (1,"Pat Smith",100001)<br>GO<br>-- Disable the trigger.<br>ALTER TABLE trig_example DISABLE TRIGGER trig1<br>GO<br>-- Attempt an insert that would normally violate the trigger<br>INSERT INTO trig_example VALUES (2,"Chuck Jones",100001)<br>GO<br>-- Re-enable the trigger.<br>ALTER TABLE trig_example ENABLE TRIGGER trig1<br>GO<br>-- Attempt an insert that violates the trigger.<br>INSERT INTO trig_example VALUES (3,"Mary Booth",100001)<br>GO<br><br><br>请参见<br><br>DROP TABLE<br><br>sp_help <br><br>&copy;1988-2000 Microsoft Corporation。保留所有权利。<br>