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 |
MSSQL约束【转】的更多相关文章
- 基础知识系列☞MSSQL→约束
遇到一个数据库设计很渣的系统··· 本来一个约束就能解决的问题·以前建库的时候也不设计好···
- MSSQL 如何删除字段的所有约束和索引
原文MSSQL 如何删除字段的所有约束和索引 代码如下: ---------------------------------------------------------- -- mp_DropC ...
- 批量删除MSSQL 中主外键约束
转自: http://www.maomao365.com/?p=813 在制作 MSSQL同步工具的时候,发现由于主外键的约束,导致数据同步异常,所有我们需要把 读数据库里面的主外键约束,进行批量删除 ...
- 关于MSSQL导入导出时主键与约束丢失的问题解决
导入数据时,使用默认选项,会丢失主键.约束.默认值等属性,按如下步骤操作: -->导出向导 -->选择数据源 -->选择目的 -->指定表复制或查询:不要使用默认选项,选择“在 ...
- [转]删除MSSQL所有的约束及表格
--删除所有约束.表.视图等SQL脚本 --############################################### --删除所有外键约束 --################# ...
- MSSQL系列 (二):表相关操作、列操作、(唯一、主键、默认、检查、外键、非空)约束、临时表
1.创建表 --创建学生班级表 create table StuClass ( ClassId int primary key, --班级ID 主键约束 ClassName nvarchar(30) ...
- mssql禁用启用主键约束
EXEC sp_msforeachtable 'ALTER TABLE ? NOCHECK CONSTRAINT ALL' --禁用 EXEC sp_msforeachtable 'ALTER TA ...
- 查询与删除MSSQL中所有外键约束
查询: SELECT 主键列ID=b.rkey ,主键列名=(SELECT name FROM syscolumns WHERE colid=b.rkey AND id=b.rkeyid) ,外键表I ...
- MSSQL数据的批量插入
一.概述: 对于数据的批量插入操作似乎成了某些大数据量操作的必用手段,MSSQL也提供了一些数据批量插入的操作方法,先将这些方法汇总,以便于下次用到使用.面对数据的批量插入操作,我们也应该考虑一个问题 ...
随机推荐
- docker官方文档笔记
Docker在 CentOS7.X上运行.Docker可能在其他EL7的兼容版本中成功安装,但是官方并未进行测试,因此也不提供任何支持. 系统环境要求 docker必须运行在64-bit的系统上,对于 ...
- android ActionBarSherlock使用说明
源代码地址:https://github.com/JakeWharton/ActionBarSherlock 1.添加项目依赖包 2.修改AndroidManifest.xml中的主题(或者继承该主题 ...
- 高阶函数 - aop面向切面编程
Function.prototype.before = function(beforefn) { var __self = this; return function() { beforefn.app ...
- oa tomcat 代码处理跨域问题
meta标签处理http.https跨域 <!-- 将http请求转成https请求 --> <meta http-equiv="Content-Security-Poli ...
- [08] AOP基本概念和使用
1.什么是AOP AOP = Aspect Oriental Programing,即面向切面编程.什么概念,我们看如下的图片: 三个方法中,重复使用了代码A和代码B,典型的场景比如"开启事 ...
- WPF中的Bitmap与byte
原文:WPF中的Bitmap与byte public MainWindow() { InitializeComponent(); byte[] b = GetPictureData(@"F: ...
- EZ 2018 07 06 NOIP模拟赛
又是慈溪那边给的题目,这次终于没有像上次那样尴尬了, T1拿到了较高的暴力分,T2没写炸,然后T3写了一个优雅的暴力就203pts,Rank3了. 听说其它学校的分数普遍100+,那我们学校还不是强到 ...
- hexo——轻量、简易、高逼格的博客
背景 写blog虽然经历了N多不同时代的产品,恒久不变的始终是自己无人问津的网站.虽然没几个人看,还是隔断时间就要折腾一下.从最开始的wordpress,到tale,到现在的hexo,网站变得越来越简 ...
- linux下安装redis组件报错-gcc报错
报错如图: 1.解决办法 先安装gcc插件.删除redis解压后文件.重新解压
- 定时备份windows机器上的文件到linux服务器上的操作梳理(rsync)
由于需要对网络设备做备份,备份文件是放到windows机器上的.现在需要将备份数据同步到linux备份机器上,想到的方案有三种: 1)将windows的备份目录共享出来,然后在linux服务器上进行挂 ...