为了减少数据冗余和使数据库内容变的严谨,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

MSSQL约束【转】的更多相关文章

  1. 基础知识系列☞MSSQL→约束

    遇到一个数据库设计很渣的系统··· 本来一个约束就能解决的问题·以前建库的时候也不设计好···

  2. MSSQL 如何删除字段的所有约束和索引

    原文MSSQL 如何删除字段的所有约束和索引 代码如下: ---------------------------------------------------------- --  mp_DropC ...

  3. 批量删除MSSQL 中主外键约束

    转自: http://www.maomao365.com/?p=813 在制作 MSSQL同步工具的时候,发现由于主外键的约束,导致数据同步异常,所有我们需要把 读数据库里面的主外键约束,进行批量删除 ...

  4. 关于MSSQL导入导出时主键与约束丢失的问题解决

    导入数据时,使用默认选项,会丢失主键.约束.默认值等属性,按如下步骤操作: -->导出向导 -->选择数据源 -->选择目的 -->指定表复制或查询:不要使用默认选项,选择“在 ...

  5. [转]删除MSSQL所有的约束及表格

    --删除所有约束.表.视图等SQL脚本 --############################################### --删除所有外键约束 --################# ...

  6. MSSQL系列 (二):表相关操作、列操作、(唯一、主键、默认、检查、外键、非空)约束、临时表

    1.创建表 --创建学生班级表 create table StuClass ( ClassId int primary key, --班级ID 主键约束 ClassName nvarchar(30) ...

  7. mssql禁用启用主键约束

    EXEC sp_msforeachtable 'ALTER TABLE ? NOCHECK CONSTRAINT ALL'  --禁用 EXEC sp_msforeachtable 'ALTER TA ...

  8. 查询与删除MSSQL中所有外键约束

    查询: SELECT 主键列ID=b.rkey ,主键列名=(SELECT name FROM syscolumns WHERE colid=b.rkey AND id=b.rkeyid) ,外键表I ...

  9. MSSQL数据的批量插入

    一.概述: 对于数据的批量插入操作似乎成了某些大数据量操作的必用手段,MSSQL也提供了一些数据批量插入的操作方法,先将这些方法汇总,以便于下次用到使用.面对数据的批量插入操作,我们也应该考虑一个问题 ...

随机推荐

  1. Java连接Redis之redis的增删改查

    一.新建一个maven工程,工程可以以jar的形式或war都行,然后导入正确的依赖 <project xmlns="http://maven.apache.org/POM/4.0.0& ...

  2. WannaCry勒索软件还在继续传播和感染中

    导读 WannaCry的大规模感染受益于影子经纪人泄露的永恒蓝色漏洞,尽管微软发布了安全更新,但许多用户还没有安装它.自最初爆发以来已经过去了18个月,但到目前为止仍有数十万用户感染了WannaCry ...

  3. Java并发(三)线程池原理

    Java中的线程池是运用场景最多的并发框架,几乎所有需要异步或并发执行任务的程序都可以使用线程池.在开发过程中,合理地使用线程池能够带来3个好处. 1. 降低资源消耗.通过重复利用已创建的线程降低线程 ...

  4. Ubuntu触摸屏校准

    我是在ubuntu系统中使用触摸屏,我的是两块屏幕一个是触摸屏幕一个是普通的屏幕,触摸屏使用需要校准,所以要直接入一个触摸屏,或者两个屏幕是复制的关系,不能是扩展. 1.安装已下的两个软件,有可能第一 ...

  5. luogu P2706 巧克力

    题目 (第一道绿题) 有点像最大子矩阵qwq 用前缀和存图,l,r代表横向的一段区间,区间和就是a[r]-a[l-1] 然后用一个k从上到下dp...因为每次l,r变化的时候原来的k就没有用了,所以k ...

  6. curl发送json格式数据

    php的curl方法详细的见官方手册. curl_setopt用法:  http://www.php.net/manual/en/function.curl-setopt.php <?php $ ...

  7. BZOJ3926 ZJOI2015 诸神眷顾的幻想乡 Trie、广义SAM

    传送门 树上的任意一条路径一定会在以某一个叶子节点为根的树上成为一条直上直下的链,而总共只有\(20\)个叶子节点. 于是每一次选所有叶子节点中的一个作为根,形成一个\(Trie\),把\(20\)个 ...

  8. Luogu P1447 [NOI2010]能量采集

    Preface 最近反演题做多了看什么都想反演.这道题由于数据弱,解法多种多样,这里简单分析一下. 首先转化下题目就是对于一个点\((x,y)\),所消耗的能量就是\(2(\gcd(x,y)-1)+1 ...

  9. 随机森林和GBDT的几个核心问题

    随机森林random forest的pro和con是什么?优势是accuracy高,但缺点是速度会降低,并且解释性interpretability会差很多,也会有overfitting的现象. 为什么 ...

  10. 【php增删改查实例】第十一节 - 部门管理模块(编辑功能)

    9. 编辑部门功能的实现 思路:只允许用户勾选一条数据,点击编辑按钮,会跳出一个和新增数据类似的对话框.然后,用户可以修改部门名称和部门编码.点击保存按钮,提示修改成功. 9.1 前台代码编写 < ...