约束 constraint
第一篇:五种约束
1. 主键约束
create table t(i int primary key) --约束名由系统自动生成
alter table dbo.t add constraint t_pk primary key (i)
创建主键时会自动创建索引,这是必然的,就算这个字段上已经有索引。
除非当前表中已经含有了cluster索引,或者创建主键时指定了nonclustered关键字,否则会创建cluster索引。
注意,字段必须首先定义为not null,才能给这个字段增加primary key约束。
2.Foreign Key约束
create table t (id int foreign key references t2(id))
alter table 表名 add constraint 约束名 foreign key(关联字段) references 主表(关联字段)
级联动作
外键约束,会限制插入或更新子表中字段的值,必须要事先在父表中已经存在。另外一方面,在父表中对主键做update或delete,也会检查子行(避免孤行)。
sqlserver默认是当子行存在时限制父行的删除,有子表的父表也不可被删除。
alter table dbo.t add constraint 约束名 foreign key(关联字段) references 主表(关联字段)
on update no action |cascade | set null | set default
on delete no action | cascade | set null | set default
默认是no action,update父行是不级联update子行。cascade是级联删除。set null与set default是sqlserver2005后引入的,即更新父行时子行置为null与置为default。
例子:
create table dbo.t1(i int not null)
alter table dbo.t1 add constraint pk_t1 primary key (i)
create table dbo.t2 (i int not null)
alter table dbo.t2 add constraint fk_t2 foreign key (i) references dbo.t1(i)
如果外键字段定义为not null,则insert或update的值必须在父表已经存在。如果定义为null,那么外键字段可以有null值,而不管父表有没有null。
3.Unique约束
create table t(i int unique)
alter table 表名 add constraint 约束名 unique (字段)
众所周知,Oracle受唯一约束的字段,是允许插入多个null值的。而这些null值,也不会被插入到唯一约束所依赖的唯一索引里面。
而Sqlserver里面,唯一约束的字段,只能有一个null值,并且,null值也会插到唯一索引里面。
创建Unique约束时,会自动建一个索引,就算这个字段上已经有索引。
对于新建的这个索引,默认是unique noncluster的。
4.Default约束
create table t (i default '男' check (i='男' or i='女')
alter table 表名 add constraint 约束名 default ('默认内容') for 字段
默认值只在insert语句中使用,在delete与update语句中会被忽略。(除非update语句里面显式说明update成default关键字)
insert语句中提供了字段的任意值,就不会使用default值。
5.Check约束
create table t (i int check (i=1 or i=2))
alter table 表名 add constraint 约束名 check (字段 between 1 and 100)
6.Not Null表定义
在Sqlserver中,not null算是表定义,而不算是约束。所以我们查一个数据字典时,是查不出not null这种约束的。但是,大众一般语义上认为这也是约束。
alter table t alter column i not null
alter table t alter column i null
第二篇:约束管理
删除约束
alter table 表名 drop constraint 约束名
删除约束会将依赖的索引一并删除。
临时停用|启用约束
当我们想输入不满足当前约束,但又是合理的数据,我们可以暂时禁用约束,待插入数据后,再启用约束。只能针对外键约束与check约束。
临时禁止约束
alter table dbo.t nocheck constraint constraint_name
禁止所有表约束:
select 'alter table '+name+' nocheck constraint all' from sysobjects where type='U'
重新启用约束
alter table dbo.t check constraint constraint_name
启用所有表约束
select 'alter table '+name+' check constraint all' from sysobjects where type='U'
对表原数据不加校验添加约束
alter table table_name with nocheck add constraint constraint_name check (age>18)
这样,表的原数据可能会不满足约束。
第三篇.数据字典
查询约束
SELECT * from INFORMATION_SCHEMA.TABLE_CONSTRAINTS
where table_name in ('T')
查看某个表上约束名与状态
sp_helpconstraint [DBO.T] --status_enabled显式该约束是否启用