SQL Server -- ALTER TABLE

通過更改、添加或刪除列和約束,重新分配分區,或者啓用或禁用約束和觸發器,從而修改表的定義。

Transact-SQL 語法約定
語法
ALTER TABLE [ database_name . [ schema_name ] . | schema_name . ] table_name
{
ALTER COLUMN column_name
{
[ type_schema_name. ] type_name [ ( { precision [ , scale ]
| max | xml_schema_collection } ) ]
[ COLLATE collation_name ]
[ NULL | NOT NULL ]
| {ADD | DROP } { ROWGUIDCOL | PERSISTED | NOT FOR REPLICATION}
}
| [ WITH { CHECK | NOCHECK } ] ADD
{
<column_definition>
| <computed_column_definition>
| <table_constraint>
} [ ,...n ]
| DROP
{
[ CONSTRAINT ] constraint_name
[ WITH ( <drop_clustered_constraint_option> [ ,...n ] ) ]
| COLUMN column_name
} [ ,...n ]
| [ WITH { CHECK | NOCHECK } ] { CHECK | NOCHECK } CONSTRAINT
{ ALL | constraint_name [ ,...n ] }
| { ENABLE | DISABLE } TRIGGER
{ ALL | trigger_name [ ,...n ] }
| SWITCH [ PARTITION source_partition_number_expression ]
TO target_table
[ PARTITION target_partition_number_expression ]
}
[ ; ]

<drop_clustered_constraint_option> ::=
{
MAXDOP = max_degree_of_parallelism
| ONLINE = {ON | OFF }
| MOVE TO { partition_scheme_name ( column_name ) | filegroup
| "default"}
}
參數
database_name

要在其中創建表的數據庫的名稱。
schema_name

表所屬架構的名稱。
table_name

要更改的表的名稱。如果表不在當前數據庫中,或者不包含在當前用戶所擁有的架構中,則必須顯式指定數據庫和架構。
ALTER COLUMN

指定要更改命名列。如果兼容級別等於或低於 65,則不允許使用 ALTER COLUMN。有關詳細信息,請參閱 sp_dbcmptlevel (Transact-SQL)。

修改後的列不能爲下列任何一種列:
數據類型爲 timestamp 的列。
表的 ROWGUIDCOL 列。
計算列或用於計算列的列。
用在索引中的列,除非該列數據類型爲 varchar、nvarchar 或 varbinary,數據類型沒有更改,而且新列大小等於或者大於舊列大小。
用於由 CREATE STATISTICS 語句生成的統計信息中的列。首先,用 DROP STATISTICS 語句刪除統計信息。由查詢優化器自動生成的統計信息將被 ALTER COLUMN 自動刪除。
用於 PRIMARY KEY 或 [FOREIGN KEY] REFERENCES 約束中的列。
用於 CHECK 或 UNIQUE 約束中的列。但是,允許更改用於 CHECK 或 UNIQUE 約束中的長度可變的列的長度。
與默認定義關聯的列。但是,如果不更改數據類型,則可以更改列的長度、精度或小數位數。
僅能通過下列方式更改 text、ntext 和 image 列的數據類型:
text 改爲 varchar(max)、nvarchar(max) 或 xml
ntext 改爲 varchar(max)、nvarchar(max) 或 xml
image 改爲 varbinary(max)
某些數據類型的更改可能導致數據的更改。例如,如果將 nchar 或 nvarchar 列改爲 char 或 varchar,則可能導致轉換擴展字符。有關詳細信息,請參閱 CAST 和 CONVERT (Transact-SQL)。降低列的精度或減少小數位數可能導致數據截斷。
無法更改已分區表的列的數據類型。
column_name

要更改、添加或刪除的列的名稱。column_name 最多可以包含 128 個字符。對於新列,如果創建列時使用的數據類型爲 timestamp,則可以省略 column_name。對於數據類型爲 timestamp 的列,如果未指定 column_name,則使用名稱 timestamp。
[ type_schema_name. ] type_name

更改後的列的新數據類型或添加的列的數據類型。不能爲已分區表的現有列指定 type_name。type_name 可以爲下列任意一種類型:
SQL Server 2005 系統數據類型。
基於 SQL Server 系統數據類型的別名數據類型。必須先用 CREATE TYPE 語句創建別名數據類型,然後才能將其用於表定義中。
.NET Framework 用戶定義類型及其所屬的架構。只有在使用 CREATE TYPE 語句創建了 .NET Framework 用戶定義類型後,才能將其用於表定義。

更改後的列的 type_name 應符合下列條件:
以前的數據類型必須可以隱式轉換爲新數據類型。
type_name 不能爲 timestamp。
對於 ALTER COLUMN,ANSI_NULL 默認值始終爲 ON;如果沒有指定,列可爲空。
對於 ALTER COLUMN,ANSI_PADDING 填充始終爲 ON。
如果修改後的列是標識列,則 new_data_type 必須是支持標識屬性的數據類型。
當前的 SET ARITHABORT 設置將被忽略。ALTER TABLE 的操作方式與 ARITHABORT 設置爲 ON 時相同。注意:
如果未指定 COLLATE 子句,則更改列的數據類型將導致更改數據庫的默認排序規則。

precision

指定的數據類型的精度。有關有效精度值的詳細信息,請參閱精度、小數位數和長度 (Transact-SQL)。
scale

是指定數據類型的小數位數。有關有效小數位數值的詳細信息,請參閱精度、小數位數和長度 (Transact-SQL)。
max

僅應用於 varchar、nvarchar 和 varbinary 數據類型,以便存儲 2^31-1 個字節的字符、二進制數據以及 Unicode 數據。
xml_schema_collection

僅應用於 xml 數據類型,以便將 XML 架構與類型相關聯。在架構集合中鍵入 xml 列之前,必須首先使用 CREATE XML SCHEMA COLLECTION 在數據庫中創建架構集合。
COLLATE < collation_name >

指定更改後的列的新排序規則。如果未指定,則爲該列分配數據庫的默認排序規則。排序規則名稱既可以是 Windows 排序規則名稱,也可以是 SQL 排序規則名稱。有關列表及詳細信息,請參閱 Windows 排序規則名稱 (Transact-SQL)和 SQL 排序規則名稱 (Transact-SQL)。

COLLATE 子句只能用來更改數據類型爲 char、varchar、nchar 和 nvarchar 的列的排序規則。若要更改用戶定義別名數據類型列的排序規則,必須執行單獨的 ALTER TABLE 語句,將列改爲 SQL Server 系統數據類型,並更改其排序規則,然後重新將列改爲別名數據類型。

如果出現以下一種或多種情況,則 ALTER COLUMN 不能更改排序規則:
CHECK 約束、FOREIGN KEY 約束或計算列引用了更改後的列。
已爲列創建了索引、統計信息或全文索引。如果更改了列的排序規則,則將刪除爲更改後的列自動創建的統計信息。
架構綁定視圖或函數引用了列。

有關詳細信息,請參閱 COLLATE (Transact-SQL)。
NULL | NOT NULL

指定列是否可接受空值。如果列不允許空值,則只有在指定了默認值或表爲空的情況下,才能用 ALTER TABLE 語句添加該列。只有同時指定了 PERSISTED 時,才能爲計算列指定 NOT NULL。如果新列允許空值,但沒有指定默認值,則新列在表中的每一行都包含一個空值。如果新列允許空值,並且指定了新列的默認值,則可以使用 WITH VALUES 將默認值存儲到表中每個現有行的新列中。

如果新列不允許空值,並且表不爲空,那麼 DEFAULT 定義必須與新列一起添加;並且,加載新列時,每個現有行的新列中將自動包含默認值。

在 ALTER COLUMN 語句中指定 NULL,可以強制 NOT NULL 列允許空值,但 PRIMARY KEY 約束中的列除外。只有列中不包含空值時,纔可以在 ALTER COLUMN 中指定 NOT NULL。必須將空值更新爲某個值後,才允許執行 ALTER COLUMN NOT NULL 語句,例如:
複製代碼
UPDATE MyTable SET NullCol = N'some_value' WHERE NullCol IS NULL
ALTER TABLE MyTable ALTER COLUMN NullCOl NVARCHAR(20) NOT NULL

如果用 CREATE TABLE 或 ALTER TABLE 語句創建或更改表,則數據庫或會話設置將影響並且可能覆蓋用於列定義的數據類型的爲空性。建議您始終將列顯式定義爲非計算列的 NULL 或 NOT NULL,或者,如果使用用戶定義的數據類型,則建議您允許該列使用此數據類型的默認爲空性。有關詳細信息,請參閱 CREATE TABLE (Transact-SQL)。 注意:
如果 ALTER COLUMN 與 NULL 或 NOT NULL 一起指定,則必須同時指定 new_data_type [(precision [, scale ])]。如果未更改數據類型、精度和小數位數,則指定當前的列值。

[ {ADD | DROP} ROWGUIDCOL ]

指定在指定列中添加或刪除 ROWGUIDCOL 屬性。ROWGUIDCOL 指示列爲行 GUID 列。每個表中只有一個 uniqueidentifier 列能指定爲 ROWGUIDCOL 列,並且只能爲 uniqueidentifier 列分配 ROWGUIDCOL 屬性。不能將 ROWGUIDCOL 分配給用戶定義數據類型的列。

ROWGUIDCOL 不強制要求列中存儲的值的唯一性,也不爲插入到表中的新行自動生成值。若要爲每列生成唯一值,則可以在 INSERT 語句中使用 NEWID 函數,也可以將 NEWID 函數指定爲列的默認值。
[ {ADD | DROP} PERSISTED ]

指定在指定列中添加或刪除 PERSISTED 屬性。該列必須是由確定性表達式定義的計算列。對於指定爲 PERSISTED 的列,SQL Server 2005 數據庫引擎將以物理方式在表中存儲計算值;並且,當更新了計算列依賴的任何其他列時,這些值也將被更新。通過將計算列標記爲 PERSISTED,可以對確定(但不精確)的表達式中定義的計算列創建索引。有關詳細信息,請參閱爲計算列創建索引。

用作已分區表的分區依據列的任何計算列必須顯式標記爲 PERSISTED。
NOT FOR REPLICATION

指定當複製代理執行插入操作時,標識列中的值不會增加。只有當 column_name 是標識列時,纔可以指定此子句。有關詳細信息,請參閱使用 NOT FOR REPLICATION 來控制約束、標識和觸發器。
WITH CHECK | WITH NOCHECK

指定表中的數據是否用新添加的或重新啓用的 FOREIGN KEY 或 CHECK 約束進行驗證。如果未指定,對於新約束,假定爲 WITH CHECK,對於重新啓用的約束,假定爲 WITH NOCHECK。

如果不想根據現有數據驗證新的 CHECK 或 FOREIGN KEY 約束,請使用 WITH NOCHECK。除極個別的情況外,建議不要進行這樣的操作。在以後所有數據更新中,都將計算該新約束。如果添加約束時用 WITH NOCHECK 禁止了約束衝突,則將來使用不符合該約束的數據來更新行時,可能導致更新失敗。

查詢優化器不考慮使用 WITH NOCHECK 定義的約束。在使用 ALTER TABLE table CHECK CONSTRAINT ALL 語句重新啓用這些約束之前,將忽略這些約束。
ADD

指定添加一個或多個列定義、計算列定義或者表約束。
DROP { [ CONSTRAINT ] constraint_name | COLUMN column_name }

指定從表中刪除 constraint_name 或 column_name。可以列出多個列或約束。如果兼容級別等於或小於 65,則不允許 DROP COLUMN。有關詳細信息,請參閱 sp_dbcmptlevel (Transact-SQL)。

可通過查詢 sys.check_constraint、sys.default_constraints、sys.key_constraints 和 sys.foreign_keys 目錄視圖來確定約束的用戶定義名稱或系統提供的名稱。

如果表中存在 XML 索引,則不能刪除 PRIMARY KEY 約束。

無法刪除以下列:
用於索引的列。
用於 CHECK、FOREIGN KEY、UNIQUE 或 PRIMARY KEY 約束的列。
與默認值(由 DEFAULT 關鍵字定義)相關聯的列,或綁定到默認對象的列。
綁定到規則的列。 注意:
刪除列並不回收列所佔的磁盤空間。當表的行大小接近或超過其限額時,必須回收已刪除的列佔用的磁盤空間。通過創建表的聚集索引或使用 ALTER INDEX 重新生成現有的聚集索引,可以回收空間。

WITH <drop_clustered_constraint_option>

指定設置一個或多個刪除聚集約束選項。
MAXDOP = max_degree_of_parallelism

只在操作期間覆蓋 max degree of parallelism 配置選項。有關詳細信息,請參閱max degree of parallelism 選項。

使用 MAXDOP 選項來限制執行並行計劃時所用的處理器數量。最大數量爲 64 個處理器。

max_degree_of_parallelism 可以是下列值之一:
1

取消生成並行計劃。
>1

將並行索引操作中使用的最大處理器數量限制爲指定數量。
0(默認值)

根據當前系統工作負荷使用實際的處理器數量或更少數量的處理器。

有關詳細信息,請參閱配置並行索引操作。 注意:
並行索引操作只適用於 SQL Server 2005 Enterprise Edition。

ONLINE = { ON | OFF }

指定在索引操作期間基礎表和關聯的索引是否可用於查詢和數據修改操作。默認值爲 OFF。
ON

在索引操作期間不持有長期表鎖。在索引操作的主要階段,源表上只使用意向共享 (IS) 鎖。這使得能夠繼續對基礎表和索引進行查詢或更新。操作開始時,將對源對象保持極短時間的共享 (S) 鎖。操作結束時,如果創建非聚集索引,將在短期內對源獲取 S(共享)鎖;當聯機創建或刪除聚集索引時,以及重新生成聚集或非聚集索引時,將在短期內獲取 SCH-M(架構修改)鎖。對本地臨時表創建索引時,ONLINE 不能設置爲 ON。
OFF

在索引操作期間應用表鎖。創建、重新生成或刪除聚集索引或者重新生成或刪除非聚集索引的脫機索引操作將對錶獲取架構修改 (Sch-M) 鎖。這樣可以防止所有用戶在操作期間訪問基礎表。創建非聚集索引的脫機索引操作將對錶獲取共享 (S) 鎖。這樣可以防止更新基礎表,但允許讀操作(如 SELECT 語句)。

有關詳細信息,請參閱聯機索引操作的工作方式。有關鎖的詳細信息,請參閱鎖模式。注意:
聯機索引操作只適用於 SQL Server 2005 Enterprise Edition。

MOVE TO ( partition_scheme_name ( column_name [ 1, ... n] ) | filegroup | "default"}

指定一個位置以移動聚集索引的葉級別中的當前數據行。表被移至新位置。注意:
在此上下文中,default 不是關鍵字。它是默認文件組的標識符,必須對其進行分隔,就像在 MOVE TO "default" 或 MOVE TO [default] 中一樣。如果指定了 "default",則當前會話的 QUOTED_IDENTIFIER 選項必須爲 ON。這是默認設置。有關詳細信息,請參閱 SET QUOTED_IDENTIFIER (Transact-SQL)。

{ CHECK | NOCHECK} CONSTRAINT

指定啓用或禁用 constraint_name。此選項只能與 FOREIGN KEY 和 CHECK 約束一起使用。如果指定了 NOCHECK,則將禁用約束,從而在將來插入或更新列時,不根據約束條件進行驗證。無法禁用 DEFAULT、PRIMARY KEY 和 UNIQUE 約束。
ALL

指定使用 NOCHECK 選項禁用所有約束,或者使用 CHECK 選項啓用所有約束。
{ENABLE | DISABLE} TRIGGER

指定啓用或禁用 trigger_name。禁用觸發器時,仍會爲表定義該觸發器;但是,當對錶執行 INSERT、UPDATE 或 DELETE 語句時,除非重新啓用觸發器,否則不會執行觸發器中的操作。
ALL

指定啓用或禁用表中的所有觸發器。
trigger_name

指定要啓用或禁用的觸發器的名稱。
SWITCH [ PARTITION source_partition_number_expression ] TO target_table [ PARTITION target_ partition_number_expression ]

用下列方式之一切換數據塊:
將表的所有數據作爲分區重新分配給現有的已分區表。
將分區從一個已分區表切換到另一個已分區表。
將已分區表的一個分區中的所有數據重新分配給現有的未分區的表。

如果 table 爲已分區表,則必須指定 source_partition_number_expression。如果 target_table 已進行分區,則必須指定 target_partition_number_expression。如果要將表的數據作爲分區重新分配給現有的已分區表,或者將分區由一個已分區表切換到另一個已分區表,則目標分區必須存在,並且必須爲空。

如果重新分配一個分區的數據以組成單個表,則必須已經創建了目標表,並且該表必須爲空。源表或分區以及目標表或分區必須在同一個文件組中。對應的索引或索引分區也必須在同一個文件組中。切換分區還有許多其他限制。有關詳細信息,請參閱使用分區切換高效傳輸數據。table 和 target_table 不能相同。target_table 可以是由多個部分構成的標識符。

source_partition_number_expression 和 target_partition_number_expression 爲常量表達式,可以引用變量和函數,其中包括用戶定義類型變量和用戶定義函數。它們不能引用 Transact-SQL 表達式。 注意:
不能對複製表使用 SWITCH 語句。

備註

若要添加新數據行,請使用 INSERT。若要刪除數據行,請使用 DELETE 或 TRUNCATE TABLE。若要更改現有行中的值,請使用 UPDATE。

如果過程緩存中存在引用表的執行計劃,ALTER TABLE 會將這些執行計劃標記爲下次執行時重新編譯。
鎖和 ALTER TABLE

ALTER TABLE 語句指定的更改將立即實現。如果這些更改需要修改表中的行,ALTER TABLE 將更新這些行。ALTER TABLE 將獲取表上的架構來修改鎖,以確保在更改期間沒有其他連接引用(甚至是該表上的元數據,也不引用),但可在結束時執行需要一個極短的 SCH-M 鎖的聯機索引操作。ALTER TABLE…SWITCH 操作中,源表和目標表都需要鎖。對錶進行的更改將記錄於日誌中,並且可以完整恢復。影響超大型表中所有行的更改,比如刪除列或者用默認值添加 NOT NULL 列,可能需要較長時間才能完成,並將生成大量日誌記錄。如同影響許多行的 INSERT、UPDATE 或者 DELETE 語句一樣,應謹慎執行這些 ALTER TABLE 語句。
並行計劃執行

在 SQL Server 2005 Enterprise Edition 中,根據 max degree of parallelism 配置選項和當前工作負荷,確定運行單個 ALTER TABLE ADD(基於索引)CONSTRAINT 或 DROP(聚集索引)CONSTRAINT 語句採用的處理器數。如果數據庫引擎檢測到系統正忙,則在語句執行開始之前將自動降低操作並行度。可以通過指定 MAXDOP 選項,手動配置用於運行此語句的處理器數。
已分區表

除了執行涉及到已分區表的 SWITCH 操作外,ALTER TABLE 還可用於更改已分區表的列、約束和觸發器的狀態,就像它用於非分區表一樣。但是,該語句不能用於更改表本身進行分區的方式。若要對已分區表進行重新分區,請使用 ALTER PARTITION SCHEME 和 ALTER PARTITION FUNCTION。此外,不能更改已分區表中列的數據類型。
對包含架構綁定視圖的表的限制

應用於包含架構綁定視圖的表的 ALTER TABLE 語句的限制,與當前修改包含簡單索引的表時應用的限制相同。允許添加列。但是,不允許刪除或更改參與任何架構綁定視圖的列。如果 ALTER TABLE 語句要求更改用於架構綁定視圖中的列,ALTER TABLE 將失敗,並且數據庫引擎將引發錯誤消息。有關架構綁定和索引視圖的詳細信息,請參閱 CREATE VIEW (Transact-SQL)。

創建引用表的架構綁定視圖不會影響爲基表添加或刪除觸發器。
索引和 ALTER TABLE

刪除約束時,作爲約束的一部分而創建的索引也將被刪除。由 CREATE INDEX 創建的索引必須使用 DROP INDEX 刪除。ALTER INDEX 語句可用於重新生成約束定義的索引部分;而不必再使用 ALTER TABLE 來刪除和添加約束。

必須刪除所有基於列的索引和約束後,才能刪除列。

如果刪除了創建聚集索引的約束,則存儲在聚集索引葉級別的數據行將存儲在非聚集表中。在 SQL Server 2005 中,可以刪除聚集索引,然後通過指定 MOVE TO 選項,在單個事務中將生成的表移至另一個文件組或分區架構。MOVE TO 選項有以下限制:
MOVE TO 對索引視圖或非聚集索引無效。
分區方案或文件組必須已經存在。
如果沒有指定 MOVE TO,則表將位於爲聚集索引定義的同一分區方案或文件組中。

刪除聚集索引時,可以指定 ONLINE = ON 選項,這樣 DROP INDEX 事務就不會阻塞對基礎數據和相關的非聚集索引的查詢和修改。

ONLINE = ON 具有下列限制:
ONLINE = ON 對於也被禁用的聚集索引無效。 必須使用 ONLINE = OFF 刪除禁用的索引。
一次只能刪除一個索引。
ONLINE = ON 對於索引視圖、非聚集索引或本地臨時表的索引無效。

刪除聚集索引時,需要大小等於現有聚集索引的大小的臨時磁盤空間。操作完成後,即可釋放此額外空間。注意:
<drop_clustered_constraint_option> 中列出的選項可適用於表的聚集索引,但不能用於視圖的聚集索引或非聚集索引。

複製架構更改

默認情況下,當在 SQL Server 發佈服務器中對發佈的表運行 ALTER TABLE 時,此更改將傳播到所有 SQL Server 訂閱服務器。此功能存在一些限制並可禁用。有關詳細信息,請參閱對發佈數據庫進行架構更改。
權限

需要對錶的 ALTER 權限。

ALTER TABLE 權限適用於 ALTER TABLE SWITCH 語句涉及的兩個表。任何已切換的數據都將繼承目標表的安全性。

如果將 ALTER TABLE 語句中的任何列定義爲公共語言運行時 (CLR) 用戶定義類型或別名數據類型,都需要對該類型有 REFERENCES 權限。
示例
A. 添加新列

以下示例將添加一個允許空值的列,而且沒有通過 DEFAULT 定義提供的值。在該新列中,每一行都將有 NULL 值。
複製代碼
CREATE TABLE doc_exa ( column_a INT) ;
GO
ALTER TABLE doc_exa ADD column_b VARCHAR(20) NULL ;
GO
EXEC sp_help doc_exa ;
GO
DROP TABLE doc_exa ;
GO
B. 刪除列

以下示例將修改一個表以刪除列。
複製代碼
CREATE TABLE doc_exb ( column_a INT, column_b VARCHAR(20) NULL) ;
GO
ALTER TABLE doc_exb DROP COLUMN column_b ;
GO
EXEC sp_help doc_exb ;
GO
DROP TABLE doc_exb ;
GO
C. 更改列的數據類型

以下示例將表中列的數據類型由 INT 改爲 DECIMAL。
複製代碼
CREATE TABLE doc_exy ( column_a INT ) ;
GO
INSERT INTO doc_exy (column_a)
VALUES (10) ;
GO
ALTER TABLE doc_exy ALTER COLUMN column_a DECIMAL (5, 2) ;
GO
DROP TABLE doc_exy ;
GO
D. 添加包含約束的列

以下示例將添加一個包含 UNIQUE 約束的新列。
複製代碼
CREATE TABLE doc_exc ( column_a INT) ;
GO
ALTER TABLE doc_exc ADD column_b VARCHAR(20) NULL
CONSTRAINT exb_unique UNIQUE ;
GO
EXEC sp_help doc_exc ;
GO
DROP TABLE doc_exc ;
GO
E. 在現有列中添加一個未經驗證的 CHECK 約束

以下示例將在表中的現有列中添加一個約束。該列包含一個違反約束的值。因此,將使用 WITH NOCHECK 以避免根據現有行驗證該約束,從而允許添加該約束。
複製代碼
CREATE TABLE doc_exd ( column_a INT) ;
GO
INSERT INTO doc_exd VALUES (-1) ;
GO
ALTER TABLE doc_exd WITH NOCHECK
ADD CONSTRAINT exd_check CHECK (column_a > 1) ;
GO
EXEC sp_help doc_exd ;
GO
DROP TABLE doc_exd ;
GO
F. 在現有列中添加一個 DEFAULT 約束

以下示例將創建一個包含兩列的表,在第一列插入一個值,另一列保持爲 NULL。然後在第二列中添加一個 DEFAULT 約束。驗證是否已應用了默認值,另一個值是否已插入第一列以及是否已查詢表。
複製代碼
CREATE TABLE doc_exz ( column_a INT, column_b INT) ;
GO
INSERT INTO doc_exz (column_a)
VALUES ( 7 ) ;
GO
ALTER TABLE doc_exz
ADD CONSTRAINT col_b_def
DEFAULT 50 FOR column_b ;
GO
INSERT INTO doc_exz (column_a)
VALUES ( 10 ) ;
GO
SELECT * FROM doc_exz ;
GO
DROP TABLE doc_exz ;
GO
G. 添加多個包含約束的列

以下示例將添加多個包含隨新列定義的約束的列。第一個新列具有 IDENTITY 屬性。表中的每一行在標識列中都有新的增量值。
複製代碼
CREATE TABLE doc_exe ( column_a INT CONSTRAINT column_a_un UNIQUE) ;
GO
ALTER TABLE doc_exe ADD

-- Add a PRIMARY KEY identity column.
column_b INT IDENTITY
CONSTRAINT column_b_pk PRIMARY KEY,

-- Add a column that references another column in the same table.
column_c INT NULL
CONSTRAINT column_c_fk
REFERENCES doc_exe(column_a),

-- Add a column with a constraint to enforce that
-- nonnull data is in a valid telephone number format.
column_d VARCHAR(16) NULL
CONSTRAINT column_d_chk
CHECK
(column_d LIKE '[0-9][0-9][0-9]-[0-9][0-9][0-9][0-9]' OR
column_d LIKE
'([0-9][0-9][0-9]) [0-9][0-9][0-9]-[0-9][0-9][0-9][0-9]'),

-- Add a nonnull column with a default.
column_e DECIMAL(3,3)
CONSTRAINT column_e_default
DEFAULT .081 ;
GO
EXEC sp_help doc_exe ;
GO
DROP TABLE doc_exe ;
GO
H. 添加包含默認值的可爲空的列

以下示例將添加一個包含 DEFAULT 定義的可爲空的列,並使用 WITH VALUES 爲表中的各個現有行提供值。如果沒有使用 WITH VALUES,那麼每一行的新列中都將具包含 NULL 值。
複製代碼
Use AdventureWorks ;
GO
CREATE TABLE doc_exf ( column_a INT) ;
GO
INSERT INTO doc_exf
VALUES (1) ;
GO
ALTER TABLE doc_exf
ADD AddDate smalldatetime NULL
CONSTRAINT AddDateDflt
DEFAULT GETDATE() WITH VALUES ;
GO
DROP TABLE doc_exf ;
GO
I. 禁用和重新啓用約束

以下示例將禁用對數據中接受的薪金進行限制的約束。NOCHECK CONSTRAINT 將與 ALTER TABLE 配合使用來禁用該約束,從而允許執行通常會違反該約束的插入操作。CHECK CONSTRAINT 將重新啓用該約束。
複製代碼
CREATE TABLE cnst_example
(id INT NOT NULL,
name VARCHAR(10) NOT NULL,
salary MONEY NOT NULL
CONSTRAINT salary_cap CHECK (salary < 100000)
)

-- Valid inserts
INSERT INTO cnst_example VALUES (1,'Joe Brown',65000)
INSERT INTO cnst_example VALUES (2,'Mary Smith',75000)

-- This insert violates the constraint.
INSERT INTO cnst_example VALUES (3,'Pat Jones',105000)

-- Disable the constraint and try again.
ALTER TABLE cnst_example NOCHECK CONSTRAINT salary_cap
INSERT INTO cnst_example VALUES (3,'Pat Jones',105000)

-- Re-enable the constraint and try another insert; this will fail.
ALTER TABLE cnst_example CHECK CONSTRAINT salary_cap
INSERT INTO cnst_example VALUES (4,'Eric James',110000) ;
J. 刪除約束

以下示例將從表中刪除 UNIQUE 約束。
複製代碼
CREATE TABLE doc_exc ( column_a INT
CONSTRAINT my_constraint UNIQUE) ;
GO
ALTER TABLE doc_exc DROP CONSTRAINT my_constraint ;
GO
DROP TABLE doc_exc ;
GO
K. 在表之間切換分區

以下示例創建一個已分區表,並假定在數據庫中已經創建了分區方案 myRangePS1。然後,在 PartitionTable 表的 PARTITION 2 所在的同一文件組中,創建與已分區表結構相同的未分區的表。最後,將 PartitionTable 表的 PARTITION 2 中的數據切換到 NonPartitionTable 表中。
複製代碼
CREATE TABLE PartitionTable (col1 int, col2 char(10))
ON myRangePS1 (col1) ;
GO
CREATE TABLE NonPartitionTable (col1 int, col2 char(10))
ON test2fg ;
GO
ALTER TABLE PartitionTable SWITCH PARTITION 2 TO NonPartitionTable ;
GO
L. 禁用和重新啓用觸發器

以下示例將使用 ALTER TABLE 的 DISABLE TRIGGER 選項來禁用觸發器,以允許執行通常會違反此觸發器的插入操作。然後,使用 ENABLE TRIGGER 重新啓用觸發器。
複製代碼
CREATE TABLE trig_example
(id INT,
name VARCHAR(12),
salary MONEY) ;
GO
-- Create the trigger.
CREATE TRIGGER trig1 ON trig_example FOR INSERT
AS
IF (SELECT COUNT(*) FROM INSERTED
WHERE salary > 100000) > 0
BEGIN
print 'TRIG1 Error: you attempted to insert a salary > $100,000'
ROLLBACK TRANSACTION
END ;
GO
-- Try an insert that violates the trigger.
INSERT INTO trig_example VALUES (1,'Pat Smith',100001) ;
GO
-- Disable the trigger.
ALTER TABLE trig_example DISABLE TRIGGER trig1 ;
GO
-- Try an insert that would typically violate the trigger.
INSERT INTO trig_example VALUES (2,'Chuck Jones',100001) ;
GO
-- Re-enable the trigger.
ALTER TABLE trig_example ENABLE TRIGGER trig1 ;
GO
-- Try an insert that violates the trigger.
INSERT INTO trig_example VALUES (3,'Mary Booth',100001) ;
GO
M. 創建包含索引選項的 PRIMARY KEY 約束

以下示例將創建 PRIMARY KEY 約束 PK_TransactionHistoryArchive_TransactionID,並設置 FILLFACTOR、ONLINE 和 PAD_INDEX 選項。生成的聚集索引將與約束同名。
複製代碼
USE AdventureWorks;
GO
ALTER TABLE Production.TransactionHistoryArchive WITH NOCHECK
ADD CONSTRAINT PK_TransactionHistoryArchive_TransactionID PRIMARY KEY CLUSTERED (TransactionID)
WITH (FILLFACTOR = 75, ONLINE = ON, PAD_INDEX = ON)
GO
N. 在 ONLINE 模式下刪除 PRIMARY KEY 約束

以下示例在 ONLINE 選項設置爲 ON 的情況下刪除 PRIMARY KEY 約束。
複製代碼
USE AdventureWorks;
GO
ALTER TABLE Production.TransactionHistoryArchive
DROP CONSTRAINT PK_TransactionHistoryArchive_TransactionID
WITH (ONLINE = ON);
GO
O. 添加和刪除 FOREIGN KEY 約束

以下示例將創建 ContactBackup 表,然後更改此表。首先添加引用 Contact 表的 FOREIGN KEY 約束,然後再刪除 FOREIGN KEY 約束。
複製代碼
USE AdventureWorks ;
GO
CREATE TABLE Person.ContactBackup
(ContactID int) ;
GO
ALTER TABLE Person.ContactBackup
ADD CONSTRAINT FK_ContactBacup_Contact FOREIGN KEY (ContactID)
REFERENCES Person.Contact (ContactID) ;
ALTER TABLE Person.ContactBackup
DROP CONSTRAINT FK_ContactBacup_Contact ;
GO
DROP TABLE Person.ContactBackup ;

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章