首页 > 数据库 >sql server 规则与约束

sql server 规则与约束

时间:2022-09-23 22:56:19浏览次数:48  
标签:单击 规则 sql 外键 约束 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数据库中建立三张表,表结构分别如下:

      1. 使用SSMS方式和T-SQL方式建立学生表学号为主键
      2. 使用命令sp_fkey查看表上的主键信息 
      3. 使用SSMS删除主键  
      4. 使用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

标签:单击,规则,sql,外键,约束,SQL,server,主键
From: https://www.cnblogs.com/e-link/p/16721165.html

相关文章

  • 用Superset学习MySQL
    链接:Superset用户消费频次消费频次用户数分布(freq,userNum)要注意的是必须将派生表重新命名(如t1)。用户最后一次消费日期为什么一定要用GROUPBY才成功?每......
  • Flask 学习-77.Flask-SQLAlchemy 一对一关系增删改查
    前言SQLAlchemy连接到关系型数据库,关系型数据最擅长的东西就是关系。一对一模型设计有个Student记录学生基本信息,Contact表记录学生联系方式,Student和Contact是一对一......
  • MySQL8 修改root用户登录密码
    在安装MySQL数据库的时候,默认不操作可能会是一个空密码。如果要设置登录密码,很多之前的旧方式,在mysql8中都不适用了,下面的这个是可以操作成功的修改mysql数据库中的user......
  • 当 EDA 遇到 Serverless,亚马逊云科技出招了
    近二三十年来,软件开发领域毫无疑问是发展最为迅速的行业之一。在上个世纪九十年代,世界上市值最高的公司大多是资源类或者重工业类的公司,例如埃克森美孚或者通用汽车,而现......
  • QL Server 2005性能计数器错误的解决办法
    查看安装帮助后,发现有这一段话:1在MicrosoftWindows2003或WindowsXP桌面上,依次单击“开始”、“运行”,然后在“打开”中键入regedit.exe,再单击“确定”。在......
  • windows server 2012 中怎么进行NIC组合
    NIC组合就是把同一台服务器上的多个物理网卡通过软件绑定成一个虚拟的网卡,也就是说,对于外部网络而言,这台服务器只有一个可见的网卡。对于任何应用程序,以及本服务器所在的网......
  • yaml代替mysql
    前言本地跑一个小项目当然不想还拿mysql了说不定要发给别人还得让别人搞个mysql,再不济得搞云又或者整sqllite,但学习成本.............所以要找个代替的...要是几年前......
  • 【转载】SQL Server跨服务器操作数据库——通过链接服务器(LinkedServer)实现SQL Serv
     基础知识介绍以SQLServer的数据库管理工具SSMS(SQLServerManagementStudio)为平台进行操作。SQLServerManagementStudio(SSMS)是用于管理SQLServer基础结......
  • Mysql数据类型
    数据库引擎InnoDB​5.5版本后MySQL默认数据库引擎,支持事物和行级锁定,只有通过索引条件检索数据,InnoDB才使用行级锁,否则,InnoDB将使用表锁。行级锁不是直接锁记录,而......
  • PostgreSQL 函数稳定性在索引与全表访问下的性能差异
     一、构建测试数据createorreplacefunctiontest_volatile(idinteger)returnsbigintvolatilelanguagesqlas$$selectcount(*)fromt1$$;/......