默認值約束(Default約束)的作用是在執行insert命令時,如果命令沒有顯式給指定的列賦值,那么把默認約束值插入到該列中;如果在Insert命令中顯式為指定的列賦值,那么將該列插入用戶顯式指定的值。每一列只能有一個default約束。默認值約束除了應用於insert命令中,也可以用於update命令,在執行update命令時,如果為一列指定default值,實際上,把該列更新為該列的默認值。
注意:數據庫系統有一個隱式的默認值,如果一個數據列可為NULL,那么NULL就是該列的默認值。
定義默認值約束可以在列級別上,也可以在表級別上。在列級別上, default 約束定義的語法是:
[CONSREAINT constraint_name] DEFAULT constant_expression
在表級別上,default 約束定義的語法是:
[ CONSTRAINT constraint_name ] DEFAULT constant_expression FOR column_name
關鍵字 DEFAULT 為列顯式指定一個常量表達式,默認值可以是常量值(Constant),標量函數(Scalar),或者NULL值。由於默認值約束是在插入數據時,為該列應有預先設置的默認值;如果該列會自動產生新值,就不需要定義默認值約束,因此,Default 約束不適用於RowVersion(或Timestamp)類型,或者擁有Identity 屬性的列。
一,測試用例
create table dbo.dt_default ( id int null constraint DF_ID default 1, -- default(1) code int null ) insert into dbo.dt_default(code) values(3) insert into dbo.dt_default(id,code) values (2,2) update dbo.dt_default set id=default where code=2
1,第一條insert語句,由於未顯式給id列賦值,那么在執行insert語句時,將默認值1插入到表中。
2,在update語句中,使用default 關鍵字對id賦值,那么id的值是default約束定義的值。
對於DEFAULT約束:
- 1、默認值只在insert語句中使用,在update語句和delete語句中被忽略。
- 2、如果在insert語句中顯式指定要插入的值,那么插入命令不使用默認值;如果沒有顯式提供值,那么總是使用默認值。
- 3,在執行update命令時,可以通過使用關鍵字DEFAULT,將更新的值設置為默認值。
二,在執行insert命令時,default 約束和check約束的執行順序
在執行insert命令時,先執行default約束,后執行check約束。
create table dbo.dt_default_Check ( id int null constraint DF_ID default 0 constraint CK_ID_IsPositive check(id>0), code int null ) insert into dbo.dt_default_Check(code) values(0)
INSERT 語句與 CHECK 約束"CK_ID_IsPositive"沖突。該沖突發生於數據庫"db_study",表"dbo.dt_default_Check", column 'id'。語句已終止。
三,在已經存在的表中增加,刪除,修改 default約束
1,增加default 約束
為一個已經存在的表增加的default 約束是表級別的約束
alter table dbo.dt_test_default add constraint DF_Test_ID default(1) for id
2,刪除Default 約束
alter table dbo.dt_test_default drop constraint DF_Test_ID
3,修改default約束
修改default約束的workaround是先刪除 default約束,后增加default約束
alter table dbo.dt_test_default drop constraint DF_Test_ID alter table dbo.dt_test_default add constraint DF_Test_ID default(2) for id
4,在表中在增加一個新的column,並指定default 約束
alter table dbo.dt_test_default add sex char(1) constraint DF_Test_Sex default('M') constraint CK_Test_Sex check(sex in('M','F'))
參考文檔:
table_constraint (Transact-SQL)
column_constraint (Transact-SQL)
ALTER TABLE (Transact-SQL)