sql server 规则与约束
规则与约束
规则是在进行INSERT或UPDATE操作时,对输入列中的数据设定的取值范围,是实现域完整性的方式之一。
规则用以限制存储在表中或用户自定义数据类型的值,是独立的数据库对象。
注意:
1、只有将规则绑定到列或用户自定义数据类型时,规则才起作用。
2、表中的每列或每个用户定义数据类型只能和一个规则绑定。但每列可应用多个CHECK约束。
3、如果要删除规则,应确定规则已经解除绑定。
规则的使用步骤如下:
① 创建规则
创建规则语法格式如下:
CREATE RULE 规则名 AS 条件表达式
其中各参数含义如下:
规则名:表示新建规则的名称。
条件表达式: 规则的条件,其中的变量必须以@开头。
例】:创建一条规限制分数在0到100分之间,语句如下:
CREATE RULE r_grade AS @grade<=100 and @grade>=0
② 绑定规则
使用SP_BINDRULE存储过程,语法格式为:
[EXEC] SP_BINDRULE [@rulename = ] 规则名称', [@objname = ] ‘表名.字段名’
【例】把规则'r_grade绑定给成绩表的期末成绩字段,使得期末成绩的值在0到100之间。代码如下:
EXEC SP_BINDRULE 'r_grade','成绩.期末成绩’
在使用规则时要注意:
-
规则不能绑定到text、image或timestamp列。
-
如果规则与绑定的列不兼容,SQL Server将在插入值时返回错误信息。
-
未解除绑定的规则,如果再次将一个新的规则绑定到列,旧的规则将自动被解除,只有最近一次绑定的规则有效
-
如果列中包含CHECK约束,则CHECK约束优先。
③ 解除规则的绑定
如果某个字段不再需要规则对其输入的数据进行限制,应该将规则从该字段上去掉,即解绑,使用SP_UNBINDRULE存储过程。语法格式如下:
[EXEC] SP_UNBINDRULE '表名.字段名'
【例】解除成绩表中期末成绩字段上的规则。语句如下:
EXEC SP_UNBINDRULE '成绩.期末成绩'
④ 删除规则
如果规则没有存在价值,可以将其删除。在删除之前,应该对规则解绑,当规则不再应用与任何表时,可以删除。语法如下:
DROP RULE 规则名称[,…n]
【例】:删除规则r_grade的语句如下:
DROP RULE r_grade
IDENTITY列
identity 表示该列字段的值会自动更新,不需要我们维护,通常情况下不能直接给 identity列直接赋值,否则编译时会报错。
语法格式为:
identity [(m, n)]
其中:
m 表示的是初始值,n 表示的是每次自动增加的值。
提示:
要么同时指定 m 和 n 的值,要么 m 和 n 都不指定,不能只写其中一个值。如:identity(5,3)、identity 是正确的,但是 identity(5)是错误的。如果 m 和 n 都未指定,则取默认值(1, 1)
数据类型是整型的列才能被定义成标识列:
int、bigint、smallint 列都可以被定义成 identity。
不含有小数位的 decimal 和 numeric 也可以被标记为 identity。如:decimal、decimal(6, 0) 字段都可以被标记为 identity,但是 decimal(6, 2) 字段就不能被标记为 identity)
标识列通常与 primary key 约束一起用作表的唯一行标识符
【例】建立学生表,使学号字段为整型数据类型,学号从20160001开始编号,自动更新自动增长为1,同时设置此字段为关键字。
CREATE TABLE 学生(
学号 INT IDENTITY(20160001,1) NO TNULL PRIMARY KEY,
姓名 varchar(20) NOT NULL,
性别 char(2),
出身日期 datetime,
入学时间 datetime)
默认对象
默认(缺省)是为列提供数据的一种方式,如果用户进行INSERT操作时不为列输入数据,则使用默认定义的值。默认有以下特点:
(1)默认是数据库对象,是独立于表和列而建立的。删除表的时候,DEFAULT约束会自动删除,但是默认值对象不会被删除。
(2)默认建立后与列或数据类型产生关联,列和数据类型就具有了缺省的属性。
在SQL Server中,有两种使用默认值的方法:
1、使用SSMS方式在创建表时,指定默认值。
在设计表时指定默认值,可以在输入字段名称后,设定该字段的默认值。如下图所示。
2、 使用T-SQL语句创建和使用默认值对象
① 创建默认对象
使用CREATE DEFAULT语句创建默认对象。其语法格式如下:
CREATE DEFAULT 默认对象名 AS 表达式
【例】创建默认对象DF_SCORE默认值为100;
CREATE DEFAULT DF_SCORE AS100
②绑定默认对象
默认对象建立以后,必须将其绑定到表字段或用户定义的数据类型上才能起作用。在查询分析器中使用系统存储过程来完成绑定,其语法格式为:
[EXEC] SP_BINDEFAULT ‘默认对象名’, ‘表名.字段名’
【例】:把上面建立的缺省对象绑定到成绩表的期末成绩和平时成绩字段中。语句如下:
EXEC SP_BINDEFAULT 'DF_SCORE', '成绩.期末成绩' ,'成绩.平时成绩'
③解除默认对象的绑定
解除绑定可以使用SP_UNBINDEFAULT存储过程。其语法格式如下:
SP_UNBINDEFAULT[@objname = ] '默认对象名'
【例4-9】:解除DF_SCORE的绑定,语句如下:
SP_UNBINDEFAULT‘DF_SCORE '
④查看默认对象
EXEC SP_HELP 默认对象
⑤删除默认对象
在删除默认对象之前,首先要确认默认对象已经解除绑定。删除默认对象使用DROP DEFAULT语句。其语法格式如下:
DROP DEFAULT {默认对象} [,…n]
【例】:删除DF_SCORE 对象语句如下:
DROP DEFAULT DF_SCORE
约束管理
约束是SQLServer提供的自动强制数据完整性的一种方法,数据的完整性就是通过各种各样的完整性约束来保证数据库中数据值是正确状态。即通过定义列的取值限制条件来维护数据的完整性。
约束类型主要有:
PRIMARY KEY约束(主键约束)
DEFAULT约束(默认约束)
CHECK约束(检查约束)
UNIQUE约束(唯一约束)
FOREIGN KEY约束(外键约束)
主键约束
主键(PRIMARY KEY)是用来唯一标识表中一条记录(行)的,它可以由一个字段或多个字段组成,用于强制表的实体完整性。
特点:
-
-
一个表只能有一个主键约束,并且主键约束中的字段值不能是空值。由于主键约束可保证数据的唯一性,因此经常使用标识列定义这种约束。
-
如果创建表时指定主键,SQL Server会自动创建一个为“PK_”且后跟表名的主键索引。SQL Server 2016数据库引擎将通过为主键字段创建唯一索引来强制数据的唯一性。如果不指定索引类型,则默认为聚集索引。
-
如果某一字段数据的值可能重复,可以选择多个字段数据组合作为主键。
-
要使用T-SQL修改PRIMARY KEY,必须先删除现有的PRIMARY KEY约束,然后再重新创建。
-
例题:
请在Students数据库中建立三张表,表结构分别如下:
-
-
- 使用SSMS方式和T-SQL方式建立学生表学号为主键
- 使用命令sp_fkey查看表上的主键信息
- 使用SSMS删除主键
- 使用T-SQL命令重建主键
-
use Clsaa_manage
CREATE TABLE 成绩表(
学号 char(10) not null PRIMARY KEY,
课程号 char(6) not null,
期末成绩 tinyint null,
平时成绩 tinyint null)
CREATE TABLE 学生表(
学号 int not null IDENTITY(10000,1) PRIMARY KEY,
姓名 varchar(20) NOT NULL,
性别 char(2),
出身日期 datetime,
班级代码 char(6),
联系电话 char(11),
家庭住址 nvarchar(30),
备注 nvarchar(100)
)
create table 教材表(
教材编号 int constraint 教材编号 foreign key references 学生表(学号) ,
教材名称 nchar(10) ,
出版社名称 nvarchar(50) not null,
单价 real not null )
EXEC sp_fkeys 学生表
唯一约束
唯一约束指在非主键的一列或多列组合的值具有唯一性,防止输入重复的值,确保数据完整性。唯一约束与主键约束的区别:
-
唯一约束的值可以有NULL值,主键约束不允许有NULL值。
-
一个表中可以有多个唯一约束,但只能有一个主键约束。
1、使用SQL Server ManagementStudio(SSMS)方式
(1)在“对象资源管理器”窗口中,依次展开数据库(student)、表节点,右键单击需要建立约束的表(如系部表),
在弹出的快捷菜单中单击“设计”命令,打开“表设计器”对话框。在“表设计器”中,右键单击任意字段,在弹出的快捷菜单中单击“索引/键”命令,打开“索引/键”对话框。
2)单击“添加”命令按钮,系统给出系统默认的唯一约束名:“IX_系部”,显示在“选定的主/唯一或索引”列表框中,单击选中唯一约束名“IX_系部”,在其右侧的“属性”窗口中,可以修改约束名称,设置约束列等。
4)设置完成后,单击“确定”按钮,回到“索引/键”对话框,修改“常规”属性中“是唯一的”属性值为“是”,最后,关闭“索引/键”对话框和“表设计器”对话框,保存设置,完成唯一约束创建。
2、使用T-SQL 语句创建唯一约束,可以在新建表时创建唯一约束,也可以在已经存在的表上建立唯一约束:
(1)新建表时创建唯一约束的语法如下:
【例】新建表test,在表的类型与时间字段建立唯一约束uniq_event。
CREATE TABLE test
( 编号 INT CONSTRAINT PR_bh PRIMARYKEY,
名称 char(20),
类型 char(20),
时间 datetime,
CONSTRAINT uniq_event UNIQUE (类型,时间)
)
GO
(2)为存在的表创建唯一约束。其语法如下:
ALTERTABLE 表名
ADD CONSTRAINT 唯一约束名
UNIQUE [CLUSTERED|NONCLUSTERED] {(列名[,…n])}
【例】为“民族”表中的“民族名称”字段创建一个唯一约束。其代码如下:
ALTER TABLE 民族
ADD CONSTRAINT uk_mzmz
UNIQUE NONCLUSTERED (民族名称 )
GO
例题
使用Students数据库中表,表结构分别如下:
1、使用SSMS方式和T-SQL方式建立教材表中出版商名称为unique约束
2、使用SSMS删除unique约束
3、使用T-SQL命令unique约束
create table 教材表(
教材编号 int constraint 教材编号 foreign key references 学生表(学号) ,
教材名称 nchar(10) ,
出版社名称 nvarchar(50) not null unique,
单价 real not null )
CHECK约束
检查约束(CHECK约束),用于定义表中字段(列)中可接受的数据值或格式,通过逻辑表达式判断输入的值是否正确。
例如学生的年龄学生系统中的年龄一般在16至25,所以可以写成表达式为:年龄>=16 AND 年龄<=25。如果输入的年龄大于25或小于16将不能输入。
可以在一列上设置多个核查约束,也可以将一个核查约束应用于多列上
1、使用SQL Server Management Studio (SSMS)方式创建检查约束
在Students数据库中,为“学生”表的“性别”列创建检查约束,从而保证在“性别”列的输入值为“男”或“女”。其操作步骤如下:
1)启动SQL Server Management Studio,在“对象资源管理器”窗口中,依次展开数据库、student、表节点。
2)右键单击“学生”表,在弹出的快捷菜单中选择“设计”选项,弹出表设计器
3)右键单击“性别”字段,在弹出的菜单中选择CHECK约束选项,如图所示
4)在“CHECK”对话框中,单击“添加”按钮,同时在对话框的右侧“表达式“栏输入逻辑表达式。在名称栏输入CHECK约束名称,如图所示,完成后单击“关闭”按钮,并保存。
2、使用T-SQL方式建立检查约束
(1)在创建表的同时建立检查约束。语法如下:
CREATE TABLE 表名
列名 数据类型及长度 列属性
CHECK (约束表达式)
(2)使用T-SQL语句为已存在的表创建检查约束,其语法格式如下:
ALTER TABLE 表名
ADD CONSTRAINT 检查约束名
CHECK (约束表达式)[,…N]
【例】在Students数据库中,为学生表的出生日期列创建一个检查约束,以保证输入的日期数据大于1985年1月1日而小于当天的日期。
ALTER TABLE学生
ADD CONSTRAINT ck_csrq
CHECK(出生日期>‘01/01/1985’AND 出生日期<GETDATE())
GO
外键约束
外键是SQL Server2016保证参照完整性的另一种设置。被设置外键的字段值必须在另外对应表的主键的值之中,也就是一个表中的外键是另一个表中的主键(PRIMARY KEY)。
1、使用SQL Server ManagementStudio创建外键约束
1)启动SQL Server Management Studio,在“对象资源管理器”窗口中,依次展开数据库(如student)、表节点。
2)右键单击 “学生”表,在弹出的快捷菜单中选择“设计”命令,打开“表设计器”对话框。在“表设计器”中,右键单击任意字段,在弹出的快捷菜单中单击“关系”命令,打开“外键关系”对话框。
3)单击“添加”命令按钮,系统给出默认的外键约束名:“FK_学生_学生”,显示在“选定的关系”列表中。
4)单击“FK_学生_学生”外键约束名,在其右侧的“属性”窗口中单击“表和列规范”属性,然后,再单击该属性右侧的“”按钮,打开“表和列”对话框。
5)在“表和列”对话框中,修改外键名称,选择主键表及表中的主键,以及外键表中的外键,修改后结果如图所示。单击“确定”命令按钮,回到“外键关系”对话框。
6)单击“关闭”按钮,完成外键的设置
2、使用T-SQL创建外键
使用T-SQL 命令方式也可以创建外键。在创建新表时同时产生外键约束以及为已经存在的表创建外键约束。
1)创建新表时建立外键约束,语法如下:
CREATE TABLE 表名
(列名 数据类型 CONSTRAINT 约束名 FOREIGN KEY REFERENCES ref_table(ref_column)
ON DELETE {CASCADE|NO ACTION}
ON UPDATE {CASCADE|NO ACTION}
NOT FOR REPLICATION
[,…N])
其中:
-
ref_table表示主键表名。
-
ref_column:表示主键的列名。
-
ON DELETE {CASCADE|NO ACTION}
-
ON UPDATE {CASCADE|NO ACTION}:表示在删除或更新外键相对应的主键所在的行时,级联删除(cascade)外键所在的行的数据或者不做任何操作 (no action)。
【例】创建表test1,表test2。在表test2中author_id字段建立外键约束,参照test1中的主键author_id。
CREATE TABLE test1
(author_id VARCHAR(20)PRIMARY KEY,
author_name VARCHAR (50),
phone VARCHAR (20),
zipcode CHAR(10)
)
CREATE TABLE test2
(title_id INTPRIMARY KEY,
title_name VARCHAR(50),
author_id VARCHAR (20)
CONSTRAINT for_auid
FOREIGNKEYREFERENCE test1(author_id)
ON DELETE CASCADE,
)
(2)、在已经存在的表上创建外键约束。语法如下:
ALTER TABLE 表名
ADD CONSTRAINT 约束名
[FOREIGN KEY ] {(列名[,…])}
REFERENCES 参考表名
[( 参考主键列[,…] ) ]
【例】在班级表上,为专业代码字段创建一个外键约束,从而保证输入有效的专业代码。其代码如下:
ALTER TABLE 班级
ADD CONSTRAINT fk_zydm FOREIGN KEY (专业代码)
REFERENCES 专业(专业代码)
GO
ALTER TABLE 学生表[表名] WITH NOCHECK ADD CONSTRAINT 学号【表的主键字段名】
FOREIGN KEY (学号)【指明外键列】
REFERENCES 成绩表(学号)【指明引用哪个表的哪些列添加外键】
GO
本文来自博客园,作者:link-零,转载请注明原文链接:https://www.cnblogs.com/e-link/p/16721165.html❤❤❤