Ms SQL Server 约束和规则

一、SQL约束

 约束定义关于列中允许值的规则,是强制完整性的标准机制。 

使用约束优先于使用触发器、规则和默认值。查询优化器也使用约束定义生成高性能的查询执行计划。

1:类型
约束的类型一共分三种
域约束: 涉及一个或多个列,(限制某一列的数据大于0)
实体约束: 相同的值不能存在于其他的行中
引用完整性约束: 一个表中的一个列与某个表中的另一个列的值匹配
2:命名
约束是可以命名的 一般这样命名:
pk_customer_***
pk代表主键 customer代表主键所在的表后面是你自己定义的(要确保整个名称的唯一性)
3:主键约束
主键约束:一般就是id, 一个表中最多有一个主键
例子1
use accounting
create table employee
(

id int identity not null,
firstname varchar(20) not null
)
例子2
use accounting
alter table employee
add constraint pk_employeeid
primary key (id)

4:外键约束
外键约束用在确保数据完整性和两个表之间的关系上
先看例子
create table orders
(
id int identity not null primary key,
customerid int not null foreign key references customer(id),
orderdate smalldatetime not null,
eid int not null
)
注意:这个表的外键必须是另一个表的主键!
在现有表上添加外键
alter table orders
add constraint fk_employee_creator_order
foreign key (eid) references employee(employeeid)
使用表自引用
表内至少要有一行数据才可以这么做
alter table employee
add constraint fk_employee_has_manager
foreign key (managerid) references employee(employeeid)
创建表的时候做表自引用 就可以忽略 foreign key 语句
表自引用的外键列 必须允许为null 要不是不允许插入的(避免对最初行的需要)

一个表与另一个表有约束,这个表是不能被删除的
级联操作
先看例子
create table orderdetails
(
orderid int not null ,
id int not null ,
description varchar(123) not null,
--设置主键
constraint pkOrderdetails primary key (orderid,id),
--设置外键,级联操作
constraint fkOrderContainsDetails
foreign key (orderid)
references orders(orderid)
on update no action
on delete cacade
)

on delete cacade 当删除父记录时 同时删除该记录
也就是当删除orders表中的一条记录,
与之相关的orderdetails表中的记录也将被删除
级联的深度是没有限制的,但是每个外键都必须设置on delete cacade
no action是可选的

5:unique约束
unique约束与主键约束类似,同样也是要求指定的列有唯一的值
但是一个表中可以有多个unique约束的列,同时这个列允许存在null值。(最多有一个null值)
看例子:
create table shippers
(
id int indentity not null primery key,
zip varchar(10) not null ,
phoneno varchar(14) not null unique

)
例子二:
alter table employee
add constraint ak_employeeSSN
unique(ssn)

6:check约束
check不局限于一个特定的列,可以约束一个列,也可以通过某个列来约束另一个列
定义check约束使用的规则与where子句中的基本一样
下面我写几个
between 1 and 12
like '[0-9][0-9][0-9]-[0-9][0-9][0-9][0-9][0-9][0-9][0-9]'
in ('ups','fed ex','usps')
price >=0
shipdate >= orderdate
看例子:
alter table customers
add constraint cn_customerDateinsystem
check
(dateinsystem <= getdate())
getdate()函数得到当前时间,上面这个例子的意思是dateinsystem列的数据不能大于当前时间
现在如果给这个列插入一个明天的时间,就会出错

7:default约束
如果插入的新行在定义了默认值的列上没有给出值,那么这个列上的数据就是定义的默认值
默认值只在insert语句中使用
如果插入的记录给出了这个列的值,那么该列的数据就是插入的数据
如果没有给出值,那么该列的数据总是默认值

8:禁用约束
在创建约束之前,数据库中已经有一些不符合规矩的数据存在。
创建约束之后,又想加入一些不符合规矩的数据。
这些时候就要禁用约束。primary key 和 unique约束 这对孪生约束是不能禁用的
对一个已经存在数据的表加一个约束:
alter table customers
add constraint cn_customerPhoneNo
check
(phone like '([0-9][0-9][0-9])[0-9][0-9][0-9][0-9][0-9][0-9]')
如果表内有不符合这个约束的记录,sqlserver就会报错
如果这样写,就不会报错了
alter table customers
with no check
add constraint cn_customerPhoneNo
check
(phone like '([0-9][0-9][0-9])[0-9][0-9][0-9][0-9][0-9][0-9]')
如果需要把一些不符合规矩的数据加入到表中怎么办

这时候就需要临时禁用现有的约束:
alter table customers
nocheck
constraint cn_customerPhoneNo
--允许不带套插入,此处的名称是前面定义的
insert into customer (phone) values (123456)
--开始不带套插入!
alter table customers
check
constraint cn_customerPhoneNo
--下次插入要带套

 

9. FOREIGN KEY约束标识表之间的关系。

   
一个表的外键指向另一个表的候选键。当外键值没有候选键时,外键可防止操作保留带外键值的行。在下例中,order_part 表建立一个外键引用前面定义的part_sample表。通常情况下,order_part在order表上也有一个外键,下面只不过是一个简单示例。
CREATE TABLE order_part
(
order_nmbr int,
part_nmbr int
FOREIGN KEY REFERENCES part_sample(part_nmbr) ON DELETE NO ACTION,
qty_ordered int
)
如果一个外键值没有候选键,则不能插入带该值(NULL除外)的行。如果尝试删除现有外键指向的行,ON DELETE子句将控制所采取的操作。
ON DELETE子句有两个选项:
A、NO ACTION指定删除因错误而失败。
B、CASCADE 指定还将删除包含指向已删除行的外键的所有行。
如果尝试更新现有外键指向的候选键值,ON UPDATE 子句将定义所采取的操作。它也支持NO ACTION和CASCADE选项。

10、列约束和表约束

 
约束可以是列约束或表约束:
列约束被指定为列定义的一部分,并且仅适用于那个列(前面的示例中的约束就是列约束)。
表约束的声明与列的定义无关,可以适用于表中一个以上的列。
当一个约束中必须包含一个以上的列时,必须使用表约束。
例如,如果一个表的主键内有两个或两个以上的列,则必须使用表约束将这两列加入主键内。假设有一个表记录工厂内的一台计算机上所发生的事件。假定有几类事件可以同时发生,但不能有两个同时发生的事件属于同一类型。这一点可以通过将type列和time列加入双列主键内来强制执行。
CREATE TABLE factory_process
(
event_type int,
event_time datetime,
event_site char(50),
event_desc char(1024),
CONSTRAINT event_key PRIMARY KEY(event_type,event_time)
)



二、规则

规则是一个向后兼容的功能,用于执行一些与CHECK约束相同的功能。CHECK约束是用来限制列值的首选标准方法。CHECK约束比规则更简明,一个列只能应用一个规则,但是却可以应用多个CHECK约束。CHECK约束作为CREATE TABLE 语句的一部分进行指定,而规则以单独的对象创建,然后绑定到列上。   
下例创建一个规则,执行与前面主题中的CHECK约束示例相同的功能。SQL Srver2005 首选的方法是 CHECK 约束。
CREATE RULE id_chk AS @id BETWEEN 0 and 10000
GO
CREATE TABLE cust_sample
(
cust_id int
PRIMARY KEY,
cust_name char(50),
cust_address char(50),
cust_credit_limit money,
)
GO
sp_bindrule id_chk,'cust_sample.cust_id'
GO


再看例子:
Create rule SalaryRule
as @salary >0;
sp_bindrule 'SalaryRule' , 'Employee.Salary'
第一句定义了一个规则叫SalaryRule
进行比较的事物是一个变量
这个变量的值是所检查的列的值
第二句把规则绑定到某个表的一个列上

规则和ckeck约束很相似,
但是规则只作用在一个列上
一个规则可以绑定在多个列上,但是它不会意识到其他列的存在
check可以定义column1>=column2

取消规则
exec sp_unbindrule 'Employee.Salary'

删除规则
Drop rule SalaryRule

1:默认值


默认值与default约束类似(有区别的,但是我说不清楚)
先看例子:
create default salarydefault
as 0;
exec sp_binddefault
'salarydefault' , 'employee.salary';
取消默认值:
exec sp_unbinddefault 'employee.salary'
删除默认值:
drop default 'salarydefault'

外记:

在Create Table 语句的属性清单后,加上外部码说明子句,格式为:
FOREIGN KEY <属性名表1> REFERENCES <表名>(<属性名表2>)
eno char(4) CONSTRAINT PK_employee PRIMARY KEY,
dno char(4)CONSTRAINT FK_employee FOREIGN KEY REFERENCES department(dno);
ALTER TABLE语句来更新与属性或表有关的各种约束。如:
ALTER TABLE employee DROP CONSTRAINT FK_employee;
ALER TABLE Salary ADD CONSTRAINT RightSalary CHECK(Insure+Fund<Rest);

转载于:https://www.cnblogs.com/sczw-maqing/p/3253102.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/259487.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Qt 独立运行时伴随CMD命令窗口

用Qt写了一个小软件&#xff0c;在把程序release后&#xff0c;打包分装后&#xff0c;发现程序运行的时候会伴随cmd命令窗口&#xff0c;可把我愁怀了 不过功夫不负有心人&#xff0c;在老师和我网友的帮助下&#xff0c;终于搞完了 CONFIG&#xff1a;指定工程配置和编译参数…

Intellij IDEA 快捷键整理(dyCopy)

原文&#xff1a;http://www.cnblogs.com/tonycody/p/3257601.html【常规】CtrlShift Enter&#xff0c;语句完成“&#xff01;”&#xff0c;否定完成&#xff0c;输入表达式时按 “&#xff01;”键CtrlE&#xff0c;最近的文件CtrlShiftE&#xff0c;最近更改的文件ShiftC…

长竖线及长括号

转载&#xff1a;http://blog.sina.com.cn/s/blog_6005d4af0101861l.html 文章修改中要求把花括号和竖线变长&#xff0c;查了下发现下面的几种方法&#xff1a; 1.花括号“{ }”变长&#xff1a; $\left\{...\right\}$&#xff1b; 或者用 $\Big\{...\Big\}$; 2.竖线“|”变长…

php 加入日志功能,php怎么写一个日志功能的函数

我们要写一个写日志的函数,首先需要了解需求,我们一般怎么用日志函数呢?例如,程序执行到某一步,我希望把这个变量(地址)$user_address的值打印到日志,我们希望日志里是这么写的:xx-xx-xx xx:xx $user_address : 上海市杨浦区xxxxx然后每一条日志都要换行,都有日期时间,假设 函…

Ant简单工程的构建

1.在Ant的官方网站http://ant.apache.org/bindownload.cgi下载Ant最新版本&#xff08;我下载的是apache-ant-1.8.2-bin.zip&#xff09;&#xff0c;Ant无需安装&#xff0c;直接解压后设置环境变量即可。 2.测试Ant是否安装成功&#xff0c;在控制台运行ant命令&#xff0c;出…

MVC学习四

第七节 讲述了增加model中类的属性&#xff0c;由于数据库中已存在表&#xff0c;表中没有存在新加的列&#xff0c;所以可以删除数据库或者在数据库中新增一列&#xff0c;另可以在controller中新增一个数据库初始化的类&#xff0c;并在Global.asax添加初始化数据库的代码 …

mysqlpump 备份文件压缩对比

mysqldump&#xff0c;使用single-transaction&#xff0c;通过管道使用gzip压缩&#xff0c;20G单数据库备份real8m15.291suser8m39.617ssys0m16.675s备份文件1.43Gmysqlpump&#xff0c;4线程&#xff0c;使用single-transaction&#xff0c;通过管道使用gzip压缩&#xff0c…

如何让Latex公式字体变小

转载&#xff1a;http://blog.sina.com.cn/s/blog_5e16f1770100gdxh.html 第一种方法&#xff1a;用比较笨的方法&#xff0c;一个一个公式用 \begin{small} \begin{equation} \ldots \end{equation} \end{small} 第二种方法&#xff1a;定义新的变量环境 在开始 \newenvironme…

php 正则表达式验证金额,php 正则表达式验证数字

非负浮点数(正浮点数 0)&#xff1a;^d(.d)?$正浮点数 ^(([0-9].[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*.[0-9])|([0-9]*[1-9][0-9]*))$非正浮点数(负浮点数 0) ^((-d(.d)?)|(0(.0)?))$负浮点数 ^(-(([0-9].[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*.[0-9])|([0-9]*[1-9]…

ASP.NET MVC:会导致锁定的会话

背景 一直没有意识到会话的访问会导致会话锁定&#xff0c;现在想想这样设计是非常合理的&#xff0c;不过某些情况下这样会导致同一个会话的并发访问非常低&#xff08;只能串行化&#xff09;&#xff0c;好在MS提供了机制让我们控制这种锁。 测试 A页面&#xff1a;缓存写入…

.NET重构(四):窗体继承+模板方法,完美实现组合查询

导读&#xff1a;在机房重构中&#xff0c;有好些个查询都是大同小异&#xff0c;最为显著的就是组合查询了。怎样给自己省事儿&#xff0c;相同的东西能不能重复利用&#xff0c;就成了一个现实的问题。第一遍做机房的时候&#xff0c;使用的更多的是&#xff1a;复制粘贴。学…

github常见操作和常见错误!错误提示:fatal: remote origin already exists.

原文链接&#xff1a;http://blog.csdn.net/dengjianqiang2011/article/details/9260435 如果输入$ git remote add origin gitgithub.com:djqiang&#xff08;github帐号名&#xff09;/gitdemo&#xff08;项目名&#xff09;.git 提示出错信息&#xff1a;fatal: remote or…

云计算的下半场

经常有人说互联网上下半场的区别&#xff0c;大体上上半场烧钱&#xff0c;下半场分出胜负。自打美团王兴抛出互联网的下半场的说法&#xff0c;大家意识到这不仅仅是新美大的下半场&#xff0c;这更是整个互联网行业的下半场。爆炸式的人口红利带来互联网行业上半场的快速增长…

oracle中的l_satids,请问shared pool中的KQR L PO存放哪些数据

ROW CACHE 也叫做 dictionary cache &#xff0c;缓存数据字典基表如 OBJ$、COL$、IND$、SEQ$的信息以便解析SQL和library cache object。包括 KQR S PO &#xff0c; KQR M PO&#xff0c;KQR L PO &#xff0c; 等KQR > ROW CACHEkqr.h 1323 KSDTRADV("ROW_CACHE&quo…

This task is currently locked by a running workflow and cannot be edited

转自&#xff1a;http://geek.hubkey.com/2007/09/locked-workflow.html 转自&#xff1a;http://blogs.code-counsel.net/Wouter/Lists/Posts/Post.aspx?Listc04a88a9%2Dd138%2D4ac3%2Da2bb%2Db95c9fdd114e&ID118 SPWorkflow.AlertTask()的时候出现“This task is curren…

ETL模型设计

传统的关系数据库一般采用二维数表的形式来表示数据&#xff0c;一个维是行&#xff0c;另一个维是列&#xff0c;行和列的交叉处就是数据元素。关系数据的基础是关系数据库模型&#xff0c;通过标准的SQL语言来加以实现。 数据仓库是多维数据库&#xff0c;它扩展了关系数据库…

《剑指offer》-整数中1出现的次数

题目描述 求出1~13的整数中1出现的次数,并算出100~1300的整数中1出现的次数&#xff1f;为此他特别数了一下1~13中包含1的数字有1、10、11、12、13因此共出现6次,但是对于后面问题他就没辙了。ACMer希望你们帮帮他,并把问题更加普遍化,可以很快的求出任意非负整数区间中1出现的…

This is Me!——回顾第一个项目的前前后后

今天终于把论文敲完了&#xff0c;一路走来&#xff0c;颇多感想。遂写下以下诸多文字&#xff0c;以飨读者。 在说这个项目之前&#xff0c;先简单介绍一下我的经历。我叫王财勇&#xff0c;家是山西的&#xff0c;2009年至2013年在新疆大学就读数学专业&#xff0c;也许有人…

从零开始学JavaScript三(变量)

一、变量 ECMAscript变量是松散型变量&#xff0c;所谓松散型变量&#xff0c;就是变量名称可以保存任何类型的数据&#xff0c;每个变量仅仅是一个用于保存值的占位符。 定义变量时要使用var操作符 如&#xff1a; var message; /*定义一个名为message的变量&#xff0c;该变量…

DES加密过程例解

DES加密算法是最被广泛使用的对称加密算法&#xff0c;通过示例来演示DES、TribleDES&#xff08;3Key&#xff09; DES-ECB&#xff1a; 按8字节为单位进行加密&#xff0c;不足8字节补0key&#xff1a; 1111111111111111indata: 2222222222222222 OutData: 950973182317F8…