一、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);

Ms SQL Server 约束和规则的更多相关文章

  1. 在英文版操作系统中安装的MS SQL server,中文字段无法匹配

    在英文版的操作系统中安装的MS SQL server,会出现中文字段无法被匹配到.其原因在于英文环境下安装的MS SQL server的排序规则不包括中文. 所以解决办法就是更改MS SQL serv ...

  2. 使用SQL脚本创建数据库,操作主键、外键与各种约束(MS SQL Server)

    在实际开发中,可能很少人会手写sql脚本来操作数据库的种种.特别是微软的MS SQL Server数据库,它的SQL Server Management Studio对数据库的图形化操作极致简便,从而 ...

  3. MS SQL SERVER 中的系统表

    MS SQL SERVER 中的系统表 序号 名称 说明 备注 1 syscolumns 每个表和视图中的每列在表中占一行,存储过程中的每个参数在表中也占一行.   2 syscomments 包含每 ...

  4. (火炬)MS SQL Server数据库案例教程

    (火炬)MS SQL Server数据库案例教程 创建数据库: CREATE DATABASE TDB //数据库名称 ON ( NAME=TDB_dat,//逻辑文件名 在创建数据库完成之后语句中引 ...

  5. SQL Server更改排序规则的实现过程

    摘自: http://www.2cto.com/database/201112/115138.html 以下的文章主要向大家描述的是SQL Server更改排序规则的实现过程,以及在实现其实际操作过程 ...

  6. MS SQL server对象类型type

    执行下面代码,将获取ms sql server对象类型以及其说明 IF OBJECT_ID('tempdb.dbo.#type') IS NOT NULL DROP TABLE #type CREAT ...

  7. MS SQL SERVER搜索某个表的主键所在的列名

    原文:MS SQL SERVER搜索某个表的主键所在的列名 SELECT SYSCOLUMNS.name  FROM SYSCOLUMNS,SYSOBJECTS,SYSINDEXES,SYSINDEX ...

  8. [转]JIRA 7.2.6与Confluence 6.0.3的安装与配置之MS SQL Server版

    相关软件版本信息 说明:下方软件可以点击链接,通过百度云盘进行下载. 操作系统:Windows 10(密码:foht)或者Windows Server 2012(密码:lsad): 数据库:SQL S ...

  9. Sql Server约束的学习二(检查约束、默认约束、禁用约束)

    接上一篇的Sql Server约束学习一(主键约束.外键约束.唯一约束) 4.检查约束 1)检查约束的定义 检查约束可以和一个列关联,也可以和一个表关联,因为它们可以检查一个列的值相对于另一个列的值, ...

随机推荐

  1. linux下关于程序性能和系统性能的工具、方法

    观察性能/状态的方法:top free netstat /pro/目录下的信息 其中/pro/meminfo下的信息相当丰富 ------------------------------------- ...

  2. JVM内存管理(二)

    JVM内存管理          JVM在执行java程序的过程中,会把内存划分为若干个不同的数据区域.这些区域都有各自的用途,以及创建和销毁的时间,有的区域随着虚拟机进程的启动而存在,有些区域则依赖 ...

  3. 1067. Disk Tree(字符串)

    1067 破题啊  写完发现理解错题意了 子目录下会有跟之前重名的 把输入的字符串存下来 排下序 然后依次找跟上面有没有重的 #include <iostream> #include< ...

  4. Android 内存管理分析(四)

    尊重原创作者,转载请注明出处: http://blog.csdn.net/gemmem/article/details/8920039 最近在网上看了不少Android内存管理方面的博文,但是文章大多 ...

  5. poj 2635 The Embarrassed Cryptographer(数论)

    题目:http://poj.org/problem?id=2635 高精度求模  同余模定理. 题意: 给定一个大数K,K是两个大素数的乘积的值.再给定一个int内的数L 问这两个大素数中最小的一个是 ...

  6. poj3216

    这是一道描述非常不清楚的题目 首先解释一下,题目中的ti是任务开始时间不是结束时间, 然后维修人员可以理解为可以再任意时间从公司出发: 好,首先不难想到用floyd预处理一下: 然后我们把每个任务看成 ...

  7. Css3 Media Queries移动页面的样式和图片的适配问题(转)

    CSS3 Media Queries 摘自:http://www.w3cplus.com/content/css3-media-queries Media Queries直译过来就是“媒体查询”,在我 ...

  8. 【转】Git详解之一:Git起步

    原文网址:http://blog.jobbole.com/25775/ 原文:<Pro Git> 起步 本章介绍开始使用 Git 前的相关知识.我们会先了解一些版本控制工具的历史背景,然后 ...

  9. 其实没那么复杂!探究react-native通信机制

    近段时间来Android上最火的框架非react native莫属了,这里我不去评价这个框架的好坏,毕竟只有用过的人才会有深刻的体会.但是我个人有一个习惯,在使用一个开源库之前,一定要看过它的源码,不 ...

  10. Entity Framework4.0 (七) EF4的存储过程

    前面了解了EF4的CRUD的操作,你会发现EF4使用起来比较简单的.呵呵,之前我们使用数据库的时候,有时会使用存储过程代替在代码中直接使用SQL语句. 使用存储过程的好处: 提高效率:因为存储过程是经 ...