一、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. Jdk5.0中出现的新特性

    掌握jdk5.0中出现的新特性1.泛型(Generics)2.增强的"for"循环(Enhanced For loop)3.自动装箱/自动拆箱(Autoboxing/unboxin ...

  2. P102、面试题14:调整数组顺序使奇数位于偶数前面

    题目:输入一个整数数组,实现一个函数来调整该数组中数字的属性怒,使得所有奇数位于数组的前半部分,所有偶数位于数组的后半部分. 思路:其实就是用快速排序法的第一轮排序,从左右夹逼,左边遇到偶数,停下来, ...

  3. 【HDOJ】2385 Stock

    水题,逆向做+优先级队列. /* 2385 */ #include <iostream> #include <sstream> #include <string> ...

  4. git svn rebase出现了checksum mismatch的错误

    http://stackoverflow.com/questions/3156744/git-svn-rebase-checksum-mismatch This solution was the on ...

  5. FrameworkElement.Name与x:Name

    在Xaml中定义某种类型的一个element就相当于构造了一个此类型的对象.如: <MyType /> 但是这个对象如何去访问?类似于CLR中在栈中存放对象在堆中的地址,然后将该栈的地址命 ...

  6. linux 入门教程

    linux入门教程 搜索 Linux入门教程 前言 第一章 关于Linux的历史 第二章 图形界面还是命令窗口 第三章 Linux操作系统的安装 第四章 初步进入linux世界 第五章 Linux系统 ...

  7. 宏ut_2pow_remainder

    求余数 12%8=4 n%m也能计算出余数,但效率可能比位操作要低一些 /*************************************************************// ...

  8. RazorEngine(未解决,留底)

    TemplateServiceConfiguration templateConfig = new TemplateServiceConfiguration { BaseTemplateType = ...

  9. 十个免费的Web压力测试工具

    两天,jnj在本站发布了<如何在低速率网络中测试 Web 应用>,那是测试网络不好的情况.而下面是十个免费的可以用来进行Web的负载/压力测试的工具,这样,你就可以知道你的服务器以及你的W ...

  10. SCOI2007蜥蜴

    Description 在一个r行c列的网格地图中有一些高度不同的石柱,一些石柱 上站着一些蜥蜴,你的任务是让尽量多的蜥蜴逃到边界外. 每行每列中相邻石柱的距离为1,蜥蜴的跳跃距离是d,即蜥蜴可以跳到 ...