Ms SQL Server 约束和规则
一、SQL约束 约束定义关于列中允许值的规则,是强制完整性的标准机制。
使用约束优先于使用触发器、规则和默认值。查询优化器也使用约束定义生成高性能的查询执行计划。
1:类型 约束的类型一共分三种 域约束: 涉及一个或多个列,(限制某一列的数据大于0) 实体约束: 相同的值不能存在于其他的行中 引用完整性约束: 一个表中的一个列与某个表中的另一个列的值匹配 2:命名 pk_customer_*** pk代表主键 customer代表主键所在的表后面是你自己定义的(要确保整个名称的唯一性) 3:主键约束 例子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约束的列,同时这个列允许存在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约束使用的规则与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]') 如果需要把一些不符合规矩的数据加入到表中怎么办 这时候就需要临时禁用现有的约束: 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表上也有一个外键,下面只不过是一个简单示例。 10、列约束和表约束约束可以是列约束或表约束: 二、规则规则是一个向后兼容的功能,用于执行一些与CHECK约束相同的功能。CHECK约束是用来限制列值的首选标准方法。CHECK约束比规则更简明,一个列只能应用一个规则,但是却可以应用多个CHECK约束。CHECK约束作为CREATE TABLE 语句的一部分进行指定,而规则以单独的对象创建,然后绑定到列上。 再看例子: 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 语句的属性清单后,加上外部码说明子句,格式为: 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); |
Ms SQL Server 约束和规则的更多相关文章
- 在英文版操作系统中安装的MS SQL server,中文字段无法匹配
在英文版的操作系统中安装的MS SQL server,会出现中文字段无法被匹配到.其原因在于英文环境下安装的MS SQL server的排序规则不包括中文. 所以解决办法就是更改MS SQL serv ...
- 使用SQL脚本创建数据库,操作主键、外键与各种约束(MS SQL Server)
在实际开发中,可能很少人会手写sql脚本来操作数据库的种种.特别是微软的MS SQL Server数据库,它的SQL Server Management Studio对数据库的图形化操作极致简便,从而 ...
- MS SQL SERVER 中的系统表
MS SQL SERVER 中的系统表 序号 名称 说明 备注 1 syscolumns 每个表和视图中的每列在表中占一行,存储过程中的每个参数在表中也占一行. 2 syscomments 包含每 ...
- (火炬)MS SQL Server数据库案例教程
(火炬)MS SQL Server数据库案例教程 创建数据库: CREATE DATABASE TDB //数据库名称 ON ( NAME=TDB_dat,//逻辑文件名 在创建数据库完成之后语句中引 ...
- SQL Server更改排序规则的实现过程
摘自: http://www.2cto.com/database/201112/115138.html 以下的文章主要向大家描述的是SQL Server更改排序规则的实现过程,以及在实现其实际操作过程 ...
- MS SQL server对象类型type
执行下面代码,将获取ms sql server对象类型以及其说明 IF OBJECT_ID('tempdb.dbo.#type') IS NOT NULL DROP TABLE #type CREAT ...
- MS SQL SERVER搜索某个表的主键所在的列名
原文:MS SQL SERVER搜索某个表的主键所在的列名 SELECT SYSCOLUMNS.name FROM SYSCOLUMNS,SYSOBJECTS,SYSINDEXES,SYSINDEX ...
- [转]JIRA 7.2.6与Confluence 6.0.3的安装与配置之MS SQL Server版
相关软件版本信息 说明:下方软件可以点击链接,通过百度云盘进行下载. 操作系统:Windows 10(密码:foht)或者Windows Server 2012(密码:lsad): 数据库:SQL S ...
- Sql Server约束的学习二(检查约束、默认约束、禁用约束)
接上一篇的Sql Server约束学习一(主键约束.外键约束.唯一约束) 4.检查约束 1)检查约束的定义 检查约束可以和一个列关联,也可以和一个表关联,因为它们可以检查一个列的值相对于另一个列的值, ...
随机推荐
- WCF之各种WCF引用方式
写在开头:本文内容来自 WCF全面解析中的一个经典例子,如果你已经看过了,那么可以忽略本文,本文旨在和大家分享不一样的WCF使用方法. 准备工作: 1.创建解决方案WCFService(当然名字可以任 ...
- nchar 和 nvarchar
字符数据类型(nchar 长度固定,nvarchar 长度可变)和 Unicode 数据使用 UNICODE UCS-2 字符集. nchar [ ( n ) ] n 个字符的固定长度的 Unicod ...
- HDU1875——畅通工程再续(最小生成树:Kruskal算法)
畅通工程再续 Description相信大家都听说一个“百岛湖”的地方吧,百岛湖的居民生活在不同的小岛中,当他们想去其他的小岛时都要通过划小船来实现.现在政府决定大力发展百岛湖,发展首先要解决的问题当 ...
- NuGet相关的文章
NuGet学习笔记(1)——初识NuGet及快速安装使用http://www.cnblogs.com/zhwl/p/3377510.html NuGet学习笔记(2) 使用图形化界面打包自己的类库ht ...
- 深入理解Java虚拟机 - 垃圾收集概述
首先需要澄清的是,垃圾收集(GC)的历史远比Java要久远,当我们意识到手动管理内存所带来的麻烦时,懒惰的天性推动先驱们寻找更为简单.易用.关键是傻瓜式的内存管理技术.GC技术起源于1960年诞生于M ...
- Entityframework常用命令
Enable-Migrations 启用Migration数据迁移 Add-Migration migrationname 添加一个migration Update-Database –TargetM ...
- 通过history.pushState无刷新改变url
通过history.pushState无刷新改变url 背景 在浏览器中改变地址栏url,将会触发页面资源的重新加载,这使得我们可以在不同的页面间进行跳转,得以浏览不同的内容.但随着单页应用的增多,越 ...
- HDU 5874 Friends and Enemies 【构造】 (2016 ACM/ICPC Asia Regional Dalian Online)
Friends and Enemies Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Othe ...
- 《深入Java虚拟机学习笔记》- 第12章 整数运算
Java虚拟机提供几种进行整数算术运算的操作码,他们执行基于int和long类型的运算.当byte.short和char类型值参与算术运算时,首先会将它们转换为int类型.这些操作码都不会抛出异常,溢 ...
- ASDL + WN725N 配置无线AP
1. ASDL 正常拨号上网 2. 安装TP-LINK无线客户端应用程序 打开之后选择模拟AP 如下图设置----应用 3. 本地连接----属性----高级 如下图设置 4. 宽带连接--- ...