SQL 新增/修改 表字段列的類型等
發(fā)布日期:2022-02-04 16:14 | 文章來源:gibhub
修改(列名前要有column關鍵字)
ALTERTABLE[USER]ALTERcolumn[NAME]varchar(35)null
新增
ALTERTABLE[USER]ADD[PRICE]numeric(18,8)NULLDEFAULT0 通過更改、添加、除去列和約束,或者通過啟用或禁用約束和觸發(fā)器來更改表的定義。 語法
ALTERTABLEtable
{[ALTERCOLUMNcolumn_name
{new_data_type[(precision[,scale])]
[COLLATE<collation_name>]
[NULL|NOTNULL]
|{ADD|DROP}ROWGUIDCOL}
]
|ADD
{[<column_definition>]
|column_nameAScomputed_column_expression
}[,...n]
|[WITHCHECK|WITHNOCHECK]ADD
{<table_constraint>}[,...n]
|DROP
{[CONSTRAINT]constraint_name
|COLUMNcolumn}[,...n]
|{CHECK|NOCHECK}CONSTRAINT
{ALL|constraint_name[,...n]}
|{ENABLE|DISABLE}TRIGGER
{ALL|trigger_name[,...n]}
} <column_definition>::=
{column_namedata_type}
[[DEFAULTconstant_expression][WITHVALUES]
|[IDENTITY[(seed,increment)[NOTFORREPLICATION]]]
]
[ROWGUIDCOL]
[COLLATE<collation_name>]
[<column_constraint>][...n] <column_constraint>::=
[CONSTRAINTconstraint_name]
{[NULL|NOTNULL]
|[{PRIMARYKEY|UNIQUE}
[CLUSTERED|NONCLUSTERED]
[WITHFILLFACTOR=fillfactor]
[ON{filegroup|DEFAULT}]
]
|[[FOREIGNKEY]
REFERENCESref_table[(ref_column)]
[ONDELETE{CASCADE|NOACTION}]
[ONUPDATE{CASCADE|NOACTION}]
[NOTFORREPLICATION]
]
|CHECK[NOTFORREPLICATION]
(logical_expression)
} <table_constraint>::=
[CONSTRAINTconstraint_name]
{[{PRIMARYKEY|UNIQUE}
[CLUSTERED|NONCLUSTERED]
{(column[,...n])}
[WITHFILLFACTOR=fillfactor]
[ON{filegroup|DEFAULT}]
]
|FOREIGNKEY
[(column[,...n])]
REFERENCESref_table[(ref_column[,...n])]
[ONDELETE{CASCADE|NOACTION}]
[ONUPDATE{CASCADE|NOACTION}]
[NOTFORREPLICATION]
|DEFAULTconstant_expression
[FORcolumn][WITHVALUES]
|CHECK[NOTFORREPLICATION]
(search_conditions)
} 參數(shù)
table 是要更改的表的名稱。如果表不在當前數(shù)據(jù)庫中或者不屬于當前用戶所擁有,可以顯式指定數(shù)據(jù)庫和所有者。 ALTERCOLUMN 指定要更改給定列。如果兼容級別是65或小于65,將不允許使用ALTERCOLUMN。 要更改的列不能是: 數(shù)據(jù)類型為text、image、ntext或timestamp的列。
表的ROWGUIDCOL列。
計算列或用于計算列中的列。
被復制列。
用在索引中的列,除非該列數(shù)據(jù)類型是varchar、nvarchar或varbinary,數(shù)據(jù)類型沒有更改,而且新列大小等于或者大于舊列大小。
用在由CREATESTATISTICS語句創(chuàng)建的統(tǒng)計中的列。首先用DROPSTATISTICS語句刪除統(tǒng)計。由查詢優(yōu)化器自動生成的統(tǒng)計會由ALTERCOLUMN自動除去。
用在PRIMARYKEY或[FOREIGNKEY]REFERENCES約束中的列。
用在CHECK或UNIQUE約束中的列,除非用在CHECK或UNIQUE約束中的可變長度列的長度允許更改。
有相關聯(lián)的默認值的列,除非在不更改數(shù)據(jù)類型的情況下允許更改列的長度、精度或小數(shù)位數(shù)。
column_name 是要更改、添加或除去的列的名稱。對于新列,如果數(shù)據(jù)類型為timestamp,column_name可以省略。對于timestamp數(shù)據(jù)類型的列,如果未指定column_name,將使用名稱timestamp。 new_data_type 是要更改的列的新數(shù)據(jù)類型。要更改的列的new_data_type應符合下列準則: 原來的數(shù)據(jù)類型必須可以隱式轉換為新數(shù)據(jù)類型。
new_data_type類型不能為timestamp。
對ALTERCOLUMN,ANSI空默認值始終打開;如果沒有指定,列將可為空。
對ALTERCOLUMN,ANSI填充始終打開。
如果要更改的列是標識列,new_data_type必須是支持標識屬性的數(shù)據(jù)類型。
將忽略SETARITHABORT的當前設置。ALTERTABLE語句的行為如同ARITHABORT選項為ON時一樣。
precision 是指定數(shù)據(jù)類型的精度。 scale 是指定數(shù)據(jù)類型的小數(shù)位數(shù)。有關有效小數(shù)位數(shù)值的更多信息, COLLATE<collation_name> 為更改列指定新的排序規(guī)則。排序規(guī)則名稱既可以是Windows排序規(guī)則名稱,也可以是SQL排序規(guī)則名稱。 COLLATE子句只能用于更改數(shù)據(jù)類型為char、varchar、text、nchar、nvarchar和ntext的列的排序規(guī)則。如果未指定,則此列采用數(shù)據(jù)庫的默認排序規(guī)則。 若滿足下列條件,則ALTERCOLUMN不能更改排序規(guī)則: 檢查約束、外鍵約束或計算列引用了更改列。
在此列上創(chuàng)建了索引、統(tǒng)計或全文索引。更改列的排序規(guī)則時,該列上自動創(chuàng)建的統(tǒng)計將除去。
SCHEMABOUND視圖或函數(shù)引用了此列。
NULL|NOTNULL 指定該列是否可接受空值。不允許空值的列只有在指定了默認值的情況下,才能用ALTERTABLE語句向表中添加。添加到表中的新列要么允許空值,要么必須指定默認值。 如果新列允許空值,而且沒有指定默認值,那么新列在表中每一行都包含空值。如果新列允許空值并且指定了新列的默認值,那么可以使用WITHVALUES選項在表中所有現(xiàn)有行的新列中存儲默認值。 如果新列不允許空值,那么新列必須具有DEFAULT定義,而且新列的所有現(xiàn)有行中將自動裝載該默認值。 可在ALTERCOLUMN語句中指定NULL以使NOTNULL列允許空值,但PRIMARYKEY約束中的列除外。只有列中不包含空值時,ALTERCOLUMN中才可指定NOTNULL。必須將空值更新為非空值后,才允許執(zhí)行ALTERCOLUMNNOTNULL語句,比如: UPDATEMyTableSETNullCol=N'some_value'WHERENullColISNULLALTERTABLEMyTableALTERCOLUMNNullCOlNVARCHAR(20)NOTNULL
如果ALTERCOLUMN中指定了NULL或NOTNULL,那么必須同時指定new_data_type[(precision[,scale])]。如果不更改數(shù)據(jù)類型、精度和小數(shù)位數(shù),請指定列的這些值的當前值。 [{ADD|DROP}ROWGUIDCOL] 指定在指定列上添加或除去ROWGUIDCOL屬性。ROWGUIDCOL是一個關鍵字,表示列是行全局唯一標識符列。對于每個表只能指派一個uniqueidentifier列作為ROWGUIDCOL列。ROWGUIDCOL屬性只能指派給uniqueidentifier列。 ROWGUIDCOL屬性并不強制列中所存儲值的唯一性。該屬性也不會為插入到表中的新行自動生成值。若要為每列生成唯一值,那么或者在INSERT語句中使用NEWID函數(shù),或者將NEWID函數(shù)指定為該列的默認值。 ADD 指定要添加一個或多個列定義、計算列定義或者表約束。 computed_column_expression 是一個定義計算列的值的表達式。計算列是并不物理地存儲在表中的虛擬列,該列用表達式計算得出,該表達式使用同一表中的其它列。例如,計算列的定義可以是:costASprice*qty。表達式可以是非計算列的列名、常量、函數(shù)、變量,也可以是用一個或多個運算符連接的上述元素的任意組合。表達式不能為子查詢。 計算列可用于選擇列表、WHERE子句、ORDERBY字句或其它任何可以使用常規(guī)表達式的位置,但下列情況除外: 計算列不能用作DEFAULT或FOREIGNKEY約束定義,也不能與NOTNULL約束定義一起使用。但是,如果計算列由具有確定性的表達式定義,并且索引列中允許計算結果的數(shù)據(jù)類型,則可將該列用作索引中的鍵列,或用作PRIMARYKEY或UNIQUE約束的一部分。
例如,如果表中有整數(shù)列a和b,那么計算列a+b上可建立索引,而計算列a+DATEPART(dd,GETDATE())上則不能,因為該值將在后續(xù)調用時更改。 計算列不能作為INSERT或UPDATE語句的目標。
說明由于表中計算列所用列中的各行可能有不同的值,所以計算列的每一行可能有不同的值。 n 是表示前面的項可重復n次的占位符。 WITHCHECK|WITHNOCHECK 指定表中的數(shù)據(jù)是否用新添加的或重新啟用的FOREIGNKEY或CHECK約束進行驗證。如果沒有指定,對于新約束,假定為WITHCHECK,對于重新啟用的約束,假定為WITHNOCHECK。 WITHCHECK和WITHNOCHECK子句不能用于PRIMARYKEY和UNIQUE約束。 如果不想用新CHECK或FOREIGNKEY約束對現(xiàn)有數(shù)據(jù)進行驗證,請用WITHNOCHECK,除了個別情況,不建議這樣使用。新約束將在以后的所有更新中生效。任何在添加約束時由WITHNOCHECK抑制的約束違規(guī)都可能導致將來的更新失敗,如果這些更新操作要更新的行中包含不符合約束條件的數(shù)據(jù)。 查詢優(yōu)化器不考慮用WITHNOCHECK定義的約束。將忽略這些約束,直到使用ALTERTABLEtableCHECKCONSTRAINTALL語句重新啟用這些約束為止。 DROP{[CONSTRAINT]constraint_name|COLUMNcolumn_name} 指定從表中刪除constraint_name或者column_name。如果兼容級別小于或等于65,將不允許DROPCOLUMN??梢粤谐龆鄠€列或約束。下面的列不能除去: 被復制列。
用在索引中的列。
用在CHECK、FOREIGNKEY、UNIQUE或PRIMARYKEY約束中的列。
有相關聯(lián)的默認值(由DEFAULT關鍵字定義)的列,或綁定到默認對象的列。
綁定到規(guī)則的列。
{CHECK|NOCHECK}CONSTRAINT 指定啟用或禁用constraint_name。如果禁用,將來插入或更新該列時將不用該約束條件進行驗證。此選項只能與FOREIGNKEY和CHECK約束一起使用。 ALL
指定使用NOCHECK選項禁用所有約束,或者使用CHECK選項啟用所有約束。
{ENABLE|DISABLE}TRIGGER 指定啟用或禁用trigger_name。當一個觸發(fā)器被禁用時,它對表的定義依然存在;然而,當在表上執(zhí)行INSERT、UPDATE或DELETE語句時,觸發(fā)器中的操作將不執(zhí)行,除非重新啟用該觸發(fā)器。 ALL
指定啟用或禁用表中所有的觸發(fā)器。 trigger_name
指定要啟用或禁用的觸發(fā)器名稱。
column_namedata_type 新列的數(shù)據(jù)類型。data_type可以是任何Microsoft®SQLServer™數(shù)據(jù)類型或用戶定義數(shù)據(jù)類型。 DEFAULT 是指定列默認值的關鍵字。DEFAULT定義可用于為表中現(xiàn)有行的新列提供值。DEFAULT定義不能添加到具有timestamp數(shù)據(jù)類型、IDENTITY屬性、現(xiàn)有DEFAULT定義或綁定默認值的列。如果列已有默認值,必須除去舊默認值后才能添加新默認值。為同SQLServer先前版本保持兼容性,向DEFAULT賦予約束名是可能的。 IDENTITY 指定新列是標識列。在表中添加新行時,SQLServer為列提供一個唯一的增量值。標識列通常與PRIMARYKEY約束一起用作表的唯一行標識符。IDENTITY屬性可賦予tinyint、smallint、int、bigint、decimal(p,0)或者numeric(p,0)列。對于每個表只能創(chuàng)建一個標識列。DEFAULT關鍵字和綁定默認值不能用于標識列。要么種子和增量都同時指定,要么都不指定。如果二者都未指定,則取默認值(1,1)。 Seed
是用于表中所裝載的第一行的值。 Increment
是添加到前一行的標識值的增量值。
NOTFORREPLICATION 指定當復制登錄(如sqlrepl)向表中插入數(shù)據(jù)時,不強制IDENTITY屬性。也可對約束指定NOTFORREPLICATION。當復制登錄向表中插入數(shù)據(jù)時,不檢查約束條件。 CONSTRAINT 指定PRIMARYKEY、UNIQUE、FOREIGNKEY或CHECK約束的開始,或者指定DEFAULT定義的開始。 constrain_name 是新約束。約束的名稱必須符合標識符規(guī)則,但其名稱的首字符不能為#。如果沒有提供constraint_name,約束使用系統(tǒng)生成的名稱。 PRIMARYKEY 是通過唯一索引對給定的一列或多列強制實體完整性的約束。對每個表只能創(chuàng)建一個PRIMARYKEY約束。 UNIQUE 是通過唯一索引為給定的一列或多列提供實體完整性的約束。 CLUSTERED|NONCLUSTERED 指定為PRIMARYKEY或UNIQUE約束創(chuàng)建聚集或非聚集索引。PRIMARYKEY約束默認為CLUSTERED;UNIQUE約束默認為NONCLUSTERED。 如果表中已存在聚集約束或索引,那么在ALTERTABLE中就不能指定CLUSTERED。如果表中已存在聚集約束或索引,PRIMARYKEY約束默認為NONCLUSTERED。 WITHFILLFACTOR=fillfactor 指定SQLServer存儲索引數(shù)據(jù)時每個索引頁的充滿程度。用戶指定的fillfactor取值范圍從1到100。如果沒有指定,那么默認值為0。創(chuàng)建索引時,fillfactor值越低,不必分配新空間即可添加的新索引條目的可用空間就越多。 ON{filegroup|DEFAULT} 指定為約束創(chuàng)建的索引的存儲位置。如果指定了filegroup,索引將在該文件組內創(chuàng)建。如果指定了DEFAULT,索引將在默認文件組內創(chuàng)建。如果未指定ON,索引將在表所在的文件組內創(chuàng)建。當為PRIMARYKEY或UNIQUE約束添加聚集索引時,如果指定了ON,那么創(chuàng)建聚集索引時整個表都將移到指定的文件組中。 在這里,DEFAULT不是一個關鍵字。DEFAULT是默認文件組的標識符,必須用符號界定,如ON"DEFAULT"或ON[DEFAULT]。 FOREIGNKEY...REFERENCES 是為列中數(shù)據(jù)提供引用完整性的約束。FOREIGNKEY約束要求列中的每個值在被引用表的指定列中都存在。 ref_table 是FOREIGNKEY約束所引用的表。 ref_column 是新FOREIGNKEY約束所引用的一列或多列(置于括號中)。 ONDELETE{CASCADE|NOACTION} 指定當表中被更改的行具有引用關系,并且該行所引用的行從父表中刪除時,要對被更改行采取的操作。默認設置為NOACTION。 如果指定CASCADE,則從父表中刪除被引用行時,也將從引用表中刪除引用行。如果指定NOACTION,SQLServer將產生一個錯誤并回滾父表中的行刪除操作。 如果表中已存在ONDELETE的INSTEADOF觸發(fā)器,那么就不能定義ONDELETE的CASCADE操作。 例如,在Northwind數(shù)據(jù)庫中,Orders表和Customers表之間有引用關系。Orders.CustomerID外鍵引用Customers.CustomerID主鍵。 如果對Customers表的某行執(zhí)行DELETE語句,并且為Orders.CustomerID指定ONDELETECASCADE操作,則SQLServer將在Orders表中檢查是否有與被刪除的行相關的一行或多行。如果存在相關行,那么Orders表中的相關行將隨Customers表中的被引用行一同刪除。 反之,如果指定NOACTION,若在Orders表中至少有一行引用Customers表中要刪除的行,則SQLServer將產生一個錯誤并回滾Customers表中的刪除操作。 ONUPDATE{CASCADE|NOACTION} 指定當表中被更改的行具有引用關系,并且該行所引用的行在父表中更新時,要對被更改行采取的操作。默認設置為NOACTION。 如果指定CASCADE,則在父表中更新被引用行時,也將在引用表中更新引用行。如果指定NOACTION,SQLServer將產生一個錯誤并回滾父表中的行更新操作。 如果表中已存在ONDELETE的INSTEADOF觸發(fā)器,那么就不能定義ONDELETE的CASCADE操作。 例如,在Northwind數(shù)據(jù)庫中,Orders表和Customers表之間有引用關系。Orders.CustomerID外鍵引用Customers.CustomerID主鍵。 如果對Customers表的某行執(zhí)行UPDATE語句,并且為Orders.CustomerID指定ONUPDATECASCADE操作,則SQLServer將在Orders表中檢查是否有與被更新行相關的一行或多行。如果存在相關行,那么Orders表中的相關行將隨Customers表中的被引用行一同更新。 反之,如果指定了NOACTION,若在Orders表中至少存在一行引用Customers表中要更新的行,那么SQLServer將引發(fā)一個錯誤并回滾Customers表中的更新操作。 [ASC|DESC] 指定加入到表約束中的一列或多列的排序次序。默認設置為ASC。 WITHVALUES 指定在添加到現(xiàn)有行的新列中存儲DEFAULTconstant_expression中所給定的值。只有在ADD列子句中指定了DEFAULT的情況下,才能使用WITHVALUES。如果要添加的列允許空值且指定了WITHVALUES,那么將在現(xiàn)有行的新列中存儲默認值。如果沒有指定WITHVALUES且列允許空值,那么將在現(xiàn)有行的新列中存儲NULL值。如果新列不允許空值,那么不論是否指定WITHVALUES,都將在現(xiàn)有行的新列中存儲默認值。 column[,...n] 是新約束所用的一列或多列(置于括號中)。 constant_expression 是用作列的默認值的字面值、NULL或者系統(tǒng)函數(shù)。 FORcolumn 指定與表級DEFAULT定義相關聯(lián)的列。 CHECK 是通過限制可輸入到一列或多列中的可能值強制域完整性的約束。 logical_expression 是用于CHECK約束的返回TRUE或FALSE的邏輯表達式。用于CHECK約束的Logical_expression不能引用其它表,但可引用同一表中同一行的其它列。 注釋
若要添加新數(shù)據(jù)行,請使用INSERT語句。若要刪除數(shù)據(jù)行,請使用DELETE或TRUNCATETABLE語句。若要更改現(xiàn)有行中的值,請使用UPDATE語句。 ALTERTABLE語句指定的更改將立即實現(xiàn)。如果這些更改需要修改表中的行,ALTERTABLE將更新這些行。ALTERTABLE將獲取表上的架構修改鎖,以確保在更改期間其它連接不能引用該表(甚至不能引用其元數(shù)據(jù))。對表進行的更改將記錄于日志中,并且可以完全恢復。影響非常大的表中所有行的更改,比如除去一列或者用默認值添加NOTNULL列,可能需要較長時間才能完成,并會生成大量日志記錄。如同影響大量行的INSERT、UPDATE或者DELETE語句一樣,這一類ALTERTABLE語句也應小心使用。 如果過程高速緩存中存在引用該表的執(zhí)行計劃,ALTERTABLE會將這些執(zhí)行計劃標記為下次執(zhí)行時重新編譯。 如果ALTERTABLE語句指定更改其它表所引用的列值,那么根據(jù)引用表中ONUPDATE或者ONDELETE所指定的操作,將發(fā)生以下兩個事件之一。 如果在引用表中沒有指定值或指定了NOACTION(默認值),那么ALTERTABLE語句導致的更改父表中被引用列的操作將回滾,并且SQLServer將引發(fā)一個錯誤。
如果在引用表中指定了CASCADE,那么由ALTERTABLE語句導致的對父表的更改將應用于父表及其相關表。
添加sql_variant列的ALTERTABLE語句會生成下列警告: Thetotalrowsize(xx)fortable'yy'exceedsthemaximumnumberofbytesperrow(8060).Rowsthatexceedthemaximumnumberofbyteswillnotbeadded.
因為sql_variant的最大長度為8016個字節(jié),所以產生該警告。當某sql_variant列所含值接近最大長度時,即會超過行長度的最大字節(jié)限制。 ALTERTABLE語句對具有架構綁定視圖的表執(zhí)行時,所受限制與當前在更改具有簡單索引的表時所受的限制相同。添加列是允許的。但是,不允許刪除或更改參與架構綁定視圖的表中的列。如果ALTERTABLE語句要求更改用在架構綁定視圖中的列,更改操作將失敗,并且SQLServer將引發(fā)一條錯誤信息。 創(chuàng)建引用表的架構綁定視圖不會影響在基表上添加或刪除觸發(fā)器。 當除去約束時,作為約束的一部分而創(chuàng)建的索引也將除去。而通過CREATEINDEX創(chuàng)建的索引必須使用DROPINDEX語句來除去。DBCCDBREINDEX語句可用來重建約束定義的索引部分;而不必使用ALTERTABLE先除去再重新添加約束。 必須刪除所有基于列的索引和約束后,才能刪除列。 添加約束時,所有現(xiàn)有數(shù)據(jù)都要進行約束違規(guī)驗證。如果發(fā)生違規(guī),ALTERTABLE語句將失敗并返回一個錯誤。 當在現(xiàn)有列上添加新PRIMARYKEY或UNIQUE約束時,該列中的數(shù)據(jù)必須唯一。如果存在重復值,ALTERTABLE語句將失敗。當添加PRIMARYKEY或UNIQUE約束時,WITHNOCHECK選項不起作用。 每個PRIMARYKEY和UNIQUE約束都將生成一個索引。UNIQUE和PRIMARYKEY約束的數(shù)目不能導致表上非聚集索引的數(shù)目大于249,聚集索引的數(shù)目大于1。 如果要添加的列的數(shù)據(jù)類型為uniqueidentifier,那么該列可以使用NEWID()函數(shù)作為默認值,以向表中現(xiàn)有行的新列提供唯一標識符值。 SQLServer在列定義中并不強制以特定的順序指定DEFAULT、IDENTITY、ROWGUIDCOL或列約束。 ALTERTABLE的ALTERCOLUMN子句并不會在列上綁定或取消綁定任何規(guī)則。必須分別使用sp_bindrule或sp_unbindrule來綁定或取消綁定規(guī)則。 可將規(guī)則綁定到用戶定義數(shù)據(jù)類型。然后CREATETABLE將自動在以該用戶定義數(shù)據(jù)類型定義的列上綁定該規(guī)則。當用ALTERCOLUMN更改列數(shù)據(jù)類型時,并不會取消綁定這些規(guī)則。原用戶定義數(shù)據(jù)類型上的規(guī)則仍然綁定在該列上。在ALTERCOLUMN更改了列的數(shù)據(jù)類型之后,隨后執(zhí)行的任何從該用戶定義數(shù)據(jù)類型上取消綁定規(guī)則的sp_unbindrule都不會導致從更改了數(shù)據(jù)類型的列上取消綁定該規(guī)則。如果ALTERCOLUMN將列的數(shù)據(jù)類型更改為綁定了規(guī)則的用戶定義數(shù)據(jù)類型,那么綁定到新數(shù)據(jù)類型的規(guī)則不會綁定到該列。 權限
ALTERTABLE權限默認授予表的所有者、sysadmin固定服務器角色成員、db_owner和db_ddladmin固定數(shù)據(jù)庫角色成員且不可轉讓。 示例
A.更改表以添加新列
下例添加一個允許空值的列,而且沒有通過DEFAULT定義提供值。各行的新列中的值將為NULL。 CREATETABLEdoc_exa(column_aINT)GOALTERTABLEdoc_exaADDcolumn_bVARCHAR(20)NULLGOEXECsp_helpdoc_exaGODROPTABLEdoc_exaGO
B.更改表以除去列
下例修改表以刪除一列。 CREATETABLEdoc_exb(column_aINT,column_bVARCHAR(20)NULL)GOALTERTABLEdoc_exbDROPCOLUMNcolumn_bGOEXECsp_helpdoc_exbGODROPTABLEdoc_exbGO
C.更改表以添加具有約束的列
下例向表中添加具有UNIQUE約束的新列。 CREATETABLEdoc_exc(column_aINT)GOALTERTABLEdoc_excADDcolumn_bVARCHAR(20)NULLCONSTRAINTexb_uniqueUNIQUEGOEXECsp_helpdoc_excGODROPTABLEdoc_excGO
D.更改表以添加未驗證的約束
下例向表中的現(xiàn)有列上添加約束。該列中存在一個違反約束的值;因此,利用WITHNOCHECK來防止對現(xiàn)有行驗證約束,從而允許該約束的添加。 CREATETABLEdoc_exd(column_aINT)GOINSERTINTOdoc_exdVALUES(-1)GOALTERTABLEdoc_exdWITHNOCHECKADDCONSTRAINTexd_checkCHECK(column_a>1)GOEXECsp_helpdoc_exdGODROPTABLEdoc_exdGO
E.更改表以添加多個帶有約束的列
下例向表中添加多個帶有約束的新列。第一個新列具有IDENTITY屬性;表中每一行的標識列都將具有遞增的新值。 CREATETABLEdoc_exe(column_aINTCONSTRAINTcolumn_a_unUNIQUE)GOALTERTABLEdoc_exeADD/*AddaPRIMARYKEYidentitycolumn.*/column_bINTIDENTITYCONSTRAINTcolumn_b_pkPRIMARYKEY,/*Addacolumnreferencinganothercolumninthesametable.*/column_cINTNULLCONSTRAINTcolumn_c_fkREFERENCESdoc_exe(column_a),/*Addacolumnwithaconstrainttoenforcethat*//*nonnulldataisinavalidphonenumberformat.*/column_dVARCHAR(16)NULLCONSTRAINTcolumn_d_chkCHECK(column_dISNULLORcolumn_dLIKE"[0-9][0-9][0-9]-[0-9][0-9][0-9][0-9]"ORcolumn_dLIKE"([0-9][0-9][0-9])[0-9][0-9][0-9]-[0-9][0-9][0-9][0-9]"),/*Addanonnullcolumnwithadefault.*/column_eDECIMAL(3,3)CONSTRAINTcolumn_e_defaultDEFAULT.081GOEXECsp_helpdoc_exeGODROPTABLEdoc_exeGO
F.添加具有默認值的可為空的列
下例添加可為空的、具有DEFAULT定義的列,并使用WITHVALUES為表中的各現(xiàn)有行提供值。如果沒有使用WITHVALUES,那么每一行的新列中都將具有NULL值。 ALTERTABLEMyTableADDAddDatesmalldatetimeNULLCONSTRAINTAddDateDfltDEFAULTgetdate()WITHVALUES
G.禁用并重新啟用一個約束
下例禁用用于限制可接受的薪水數(shù)據(jù)的約束。WITHNOCHECKCONSTRAINT與ALTERTABLE一起使用,以禁用該約束并使正常情況下會引起約束違規(guī)的插入操作得以執(zhí)行。WITHCHECKCONSTRAINT重新啟用該約束。 CREATETABLEcnst_example(idINTNOTNULL,nameVARCHAR(10)NOTNULL,salaryMONEYNOTNULLCONSTRAINTsalary_capCHECK(salary<100000))--ValidinsertsINSERTINTOcnst_exampleVALUES(1,"JoeBrown",65000)INSERTINTOcnst_exampleVALUES(2,"MarySmith",75000)--Thisinsertviolatestheconstraint.INSERTINTOcnst_exampleVALUES(3,"PatJones",105000)--Disabletheconstraintandtryagain.ALTERTABLEcnst_exampleNOCHECKCONSTRAINTsalary_capINSERTINTOcnst_exampleVALUES(3,"PatJones",105000)--Reenabletheconstraintandtryanotherinsert,willfail.ALTERTABLEcnst_exampleCHECKCONSTRAINTsalary_capINSERTINTOcnst_exampleVALUES(4,"EricJames",110000)
H.禁用并重新啟用觸發(fā)器
下例使用ALTERTABLE的DISABLETRIGGER選項來禁用觸發(fā)器,以使正常情況下會違反觸發(fā)器條件的插入操作得以執(zhí)行。然后下例使用ENABLETRIGGER重新啟用觸發(fā)器。 CREATETABLEtrig_example(idINT,nameVARCHAR(10),salaryMONEY)go--Createthetrigger.CREATETRIGGERtrig1ONtrig_exampleFORINSERTasIF(SELECTCOUNT(*)FROMINSERTEDWHEREsalary>100000)>0BEGINprint"TRIG1Error:youattemptedtoinsertasalary>$100,000"ROLLBACKTRANSACTIONENDGO--Attemptaninsertthatviolatesthetrigger.INSERTINTOtrig_exampleVALUES(1,"PatSmith",100001)GO--Disablethetrigger.ALTERTABLEtrig_exampleDISABLETRIGGERtrig1GO--AttemptaninsertthatwouldnormallyviolatethetriggerINSERTINTOtrig_exampleVALUES(2,"ChuckJones",100001)GO--Re-enablethetrigger.ALTERTABLEtrig_exampleENABLETRIGGERtrig1GO--Attemptaninsertthatviolatesthetrigger.INSERTINTOtrig_exampleVALUES(3,"MaryBooth",100001)GO
版權聲明:本站文章來源標注為YINGSOO的內容版權均為本站所有,歡迎引用、轉載,請保持原文完整并注明來源及原文鏈接。禁止復制或仿造本網站,禁止在非www.sddonglingsh.com所屬的服務器上建立鏡像,否則將依法追究法律責任。本站部分內容來源于網友推薦、互聯(lián)網收集整理而來,僅供學習參考,不代表本站立場,如有內容涉嫌侵權,請聯(lián)系alex-e#qq.com處理。
相關文章