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)检查约束的定义 检查约束可以和一个列关联,也可以和一个表关联,因为它们可以检查一个列的值相对于另一个列的值, ...
随机推荐
- 使用xilinx的documentation navigator快速查找资料
2013-06-22 14:56:39 documentation navigator是xilinx的资料导航,是一个小插件,可以到xilinx的官网上下载,我的是Xilinx_DocNav_2013 ...
- 食物卡喉别拍背部!救了100多万人性命的“海姆立克急救法"
先讲三个事例: 一.近日,浙江金华一个17月大的小贝边玩边吃花生,被噎住.10多分钟后,奶奶发现小贝大口喘气,以为他玩累了就抱他回家,等父母赶到送医已晚.小贝大脑受损严重-父母含泪同意放弃治疗,孩子走 ...
- Android开发之全屏显示的两种方法
1.通过修改清单文件中Theme,实现全屏 <application android:name=".MyApplication" android:allowBackup=&q ...
- java jvm学习笔记九(策略文件)
欢迎装载请说明出处:http://blog.csdn.net/yfqnihao/article/details/8271407 课程源码:http://download.csdn.net/detail ...
- NGINX开篇
前言 最近空闲时间比较多, 开始阅读nginx源码, 阅读的过程总结和笔记整理了下, 汇集成了一个系列的文章, 由于nginx功能实在太多, 没法做到面面俱到, 只对已经阅读过的源码进行记录总结, 以 ...
- HDU 5694 BD String 递归暴力
http://blog.csdn.net/angon823/article/details/51484906 #include <cstdio> #include <iostream ...
- HDU 3085 Nightmare Ⅱ 双向BFS
题意:很好理解,然后注意几点,男的可以一秒走三步,也就是三步以内的都可以,鬼可以穿墙,但是人不可以,鬼是一次走两步 分析:我刚开始男女,鬼BFS三遍,然后最后处理答案,严重超时,然后上网看题解,发现是 ...
- mysql远程连接出现 ERROR 2003 (HY000): Can't connect to MySQL server on IP
修改了如下两个位置,解决了这个问题: 修改/etc/mysql/my.cof配置文件:因为mysql默认只允许本机连接 修改远程连接用户权限:远程连接的用户被设置为不允许远程连接 首先修改/etc/m ...
- (一)NUnit单元测试心得
由于各种缘由,一本<.Net单元测试艺术>突然出现在了我的办公桌上,于是我的单元测试之路就此开始.通过一两个月不间断的学习,以及不断结合具体的项目做开发,再结合书上的知识对单元测试有了一些 ...
- Physics2D.Linecast中的参数layerMask
static RaycastHit2D Linecast(Vector2 start, Vector2 end, int layerMask = DefaultRaycastLayers, float ...