MSSQL约束【转】

      为了减少数据冗余和使数据库内容变的严谨,MSSQL数据库里引入了关系和约束。我们平时做一些小程序,需要使用到MSSQL数据库的时候大多没有严格去规划一下数据库的设计,但是真正开发的时候需要你严格的进行需求分析后再进行数据库设计,好的数据库设计对于维护和未来对程序的扩展有着非常大的好处。

      所以我觉的学习一下约束和关系还是挺重的。我是现学现卖,将学习的过程记录一下:

在学习之前先背几个单词,在需要在SQL语句写的时候用到:

  • Alter:改变
  • Primary:主要
  • Constraint:约束
  • Unique:唯一的、独特的
  • Foreign::外国的,外交的
  • Reference:参考,引用,提及
  • Cascade: 层叠,串联的

数据库约束是为了保证数据的完整性而实现的一套机制,约束有:

  • 非空约束
  • 主键约束(PK) Primary key constraint
  • 唯一约束(UQ) Unique constraint
  • 默认约束(DF) Default constraint
  • 检查约束(CK) Check constraint
  • 外键约束(FK) Foreign key constraint

我们首先来创建一张表teacher

create  table  teacher
(
     tId int  not  null ,
     tname nvarchar(50),
     tage int ,
     tsalary int
)

如何给表增加字段

alter table teacher

add ttest nvarchar(50)

如图,看到添加了ttest字段


先看一下主键约束

1
2
alter  table  teacher
add  constraint  PK_Teacher  primary  key (tId)

维一约束:

1
2
alter  table  teacher
add  constraint   UQ_Teacher_tname  unique (tname)

那么唯一约束有什么不同。我们可以往数据库插入两条数据

insert  into  teacher(tId,tname,tage,tsalary) values ( '1' , 'Jack' ,18, '3000' );
insert  into  teacher(tId,tname,tage,tsalary) values ( '2' , 'Jack' ,21, '4000' );

发现在执行第二条数据的时候报错:

消息2627,级别14,状态1,第1 行

违反了UNIQUE KEY 约束'UQ_Teacher_tname'。不能在对象'dbo.teacher' 中插入重复键。

通过这样,从而保证了数据的正确性

默认约束

alter  table  teacher
add  constraint  DF_Teacher_age default (18) for  tage

检查约束

--为了方便测试,进行检查约束前先对表添加一个sex字段
alter  table  teacher
add  tsex nvarchar(2)
  
--接着将表里的tsex字段数据全部改成男
  
update  teacher set  tsex= '男'
  
--进行检查约束
  
alter  table  teacher
  
add  constraint  CK_Teacher_Tsex check  (tsex= '男'  or  tsex= '女' );
  
--测试检查约束
  
insert  into  teacher(tId,tname,tage,tsalary,tsex) values ( '3' , 'CJ' , '32' , '10000' , '猫' );

发现错误,因为猫不是正常规定的人的性别该有的男和女。

消息547,级别16,状态0,第1 行

INSERT 语句与CHECK 约束"CK_Teacher_Tsex"冲突。该冲突发生于数据库"MySchool",表"dbo.teacher", column 'tsex'。

语句已终止。

 

那里在工具里怎么设置呢? 右键字段tsex选择CHECK约束

在管理器的表设计里,右键Ttest选关系,如下图所示

也可以对年龄的范围进行约束:

alter  table  teacher
add  constraint  CK_Teacher_Tage check (tage>=18 and  tage<100);

外键约束:

--为了进行外键约束的测试,先建一个表
  
create  table  student
  
(
  
sid int  not  null ,
  
sname nvarchar(50),
  
sage int ,
  
ssex nvarchar(2)
  
)
  
--往student表里追加一个字段用作外键约束
  
alter  table  student
  
add  tid int  not  null
  
--往student表里插入一条数据
  
insert  into  student(sid,sname,sage,ssex,tid) values ( '1' , '春晓' , '23' , '男' ,1);
  
--将teacher表和student表进行外键约束
  
--由于是给student表的tid字段增加的外键约束,所以他所约束的另一张表的约束字段必需是主键
  
alter  table  student
  
add  constraint  FK_student_tId foreign  key (tid) references  teacher(tid)
  
--对student表的tid字段创建好外键后如果进行插入数据是teacher表里的tid字段里没有的值,那么会报错。
  
--例如下面的是错误的
  
insert  into  insert  into  student(sid,sname,sage,ssex,tid) values ( '1' , '春晓' , '23' , '男' ,100);
  
--如果要删除student表外键约束的主表teacher里的数据,会报错
  
delete  teacher where  tId=1;
  
   
  
--如何想要删除teacher表里的数据?要那么先要删除student表里tid=1的数据,才可以删除
  
--我们也可以在创建外键约束的时候,进行删除的级联设置
  
--如下SQL语句
  
alter  table  student
  
add  constraint  FK_student_tId foreign  key (tid) references  teacher(tid)
  
on  delete  cascade
  
--当然也可以进行级联修改:
  
alter  table  student
  
add  constraint  FK_student_tId foreign  key (tid) references  teacher(tid)
  
on  update  cascade

那么如何在管理器里进行外键的设置 如下图 右键tid选关系。在表的规范里进行设置主表和外表的关系,在Insert和Update规范里进行设置更新和删除的级联设置。

综合练习

--下面来做一个踪合的约束设置
--创建一个Employee表
--对tId 设置为主键
--对tName 控制是唯一
--对tSex 控制只能是男女
--对tAge 控制只在-60之间默认值是
  
create  table  Employee
(
     tId int  not  null ,
     tName nvarchar(50),
     tSex nvarchar(2),
     tAge int
)
  
alter  table  Employee
add  constraint  PK_Employee_tId primary  key (tId),
constraint  UQ_Employee_tName unique (tName),
constraint  CK_Employee_tSex check (tSex= '男'  or  tSex= '女' ),
constraint  CK_Employee_tAge check (tAge>=18 and  tAge<=100),
constraint  DF_Employee_tAge default (18) for  tAge
  
--现在我们将原来的Employee表删除,我们在创建表的时候进行约束设置
--对tId 设置为主键
--对tName 控制是唯一
--对tSex 控制只能是男女
--对tAge 控制只在-60之间默认值是
drop  table  Employee
create  table  Employee
(
     tId int  not  null  primary  key ,
     tName nvarchar(50) unique ,
     tSex nvarchar(2) check (tSex= '男'  or  tSex= '女' ),
     tAge int  check (tAge>=19 and  tAge<=60) default (18)
)
  
--如何想在创建表的时候对约束起名字,可以写成这种形式
tSex nvarchar(2) constraint  CK_Employee_tSex check (tSex= '男'  or  tSex= '女' ),

最后我们那约束进行删除 该怎么办, 如下SQL语句:

alter  table  Employee
drop  constraint  CK_Employee_tSex

猜你喜欢

转载自www.cnblogs.com/jijm123/p/10495058.html