約束3:default約束


默認值約束(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)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM