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)检查约束的定义 检查约束可以和一个列关联,也可以和一个表关联,因为它们可以检查一个列的值相对于另一个列的值, ...
随机推荐
- [Err]1267 - Illegal mix of collations(utf8_general_ci,IMPLICIT) and (utf8_unicode_ci,IMPLICIT) for operation ‘=’
SELECT * FROM table_a a where a.id NOT IN (SELECT b.id FROM table_b b); 先将两个数据表的编码统一,如果table_a的编码为 ...
- 摄像头(2)调用系统拍照activity来录像
import android.app.Activity; import android.content.Intent; import android.content.pm.PackageManager ...
- 微软嵌入式WEC2013产品研讨会(深圳站---2013.10.16)
主要内容如下: 1. Windows Embedded Compact 2013面向的市场 主要面向工业自动化.医疗设备和零售行业这些市场,和物联网关系非常紧密. 2. Windo ...
- Android开发之xUtils-HttpUtils的使用
使用xUtils框架中的网络部分HttpUtils,功能:下载,断点续传,progressbar显示进度,文本显示进度% import java.io.File; import android.app ...
- Android开发之异步消息处理机制Handler
更加详细的介绍Handler的博文-http://blog.csdn.net/guolin_blog/article/details/9991569 Android中的异步消息处理主要有四个部分组成, ...
- chrome插件background.js 和 popup.js 交互
要实现background.js 和 popup.js 之间的交互,首先需要先配置好 manifest.json文件,如: "background":{ //"page& ...
- Codeforces Round #224 (Div. 2)
题目:http://codeforces.com/contest/382 A Ksenia and Pan Scales 一个求天平是否能够平衡的题目...水题,注意一下结果的输出就行. #inclu ...
- SQL列数据转换为字符串
行列转换,将列数据转换为字符串输出 ) SET @center_JZHW = ( SELECT DISTINCT STUFF( ( SELECT ',' + ce_code FROM ap_cente ...
- PHP超大文件下载,断点续传下载
源代码: <?php $sourceFile = "1.tmp"; //要下载的临时文件名 $outFile = "用户订单.xls"; //下载保存到客 ...
- Excel 内容粘贴到DataGridView, DataGridView 粘贴到 Excel
void dataGridView1_KeyDown(object sender, KeyEventArgs e) { if (e.Control && e.KeyCode == Ke ...