Default约束的作用是在insert语句执行时,如果未显式给指定的column赋值,那么使用默认值给column赋值;如果在Insert命令中显式为指定的Column赋值,那么将插入显式值。每一列只能有一个default约束。
在执行update命令时,如果为Column指定default值,实际上,使用该column的默认值为该column赋值。
在Column Level上, default 约束定义的语法是:
[CONSREAINT constraint_name] DEFAULT constant_expression
在Table Level上,default 约束定义的语法是:
[ CONSTRAINT constraint_name ] DEFAULT constant_expression FOR column_name
关键字 DEFAULT 为Column显式指定一个默认值,默认值可以是常量值(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约束,
create table dbo.dt_test_default ( id int , code int )
1,增加default 约束,此时增加的default 约束是table level的约束
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)