数据完整性约束(SQL Server)

1. PRIMARY KEY 主键约束

  • 表中的主键必须满足下列两个条件:
    ① 任意两行都不具有相同的主键值;
    ② 每一行都必须具有一个主键值(即主键列不允许空值)。
  • 一个表只能有一个主键,主键通常定义在表的一列上,也可以使用多个列的组合定义主键(称为组合主键)。在使用多个列作为主键时,上述两个条件必须应用到构成主键的所有列,即所有组合列的值必须是唯一的(但单个列的值可以不唯一),组合列中的每一个列都必须为非空值。
  • 在定义主键约束时, SQL Server 自动为主键列创建一个唯一索引( Unique Index )。该索引可以用来快速数据查询速度。
  • 主键可以在创建表时的某一列中定义,也可以通过表修改语句( ALTER TABLE )在创建表之后再定义。在列定义中把一个列设置为主键称为列级约束,在列定义之后设置主键被称为表级约束。组合主键必须使用表级约束进行定义。
  • 约束也是一种数据库对象,因此同一个数据库的约束名是不允许重复的。定义列级约束时,约束的名称是可以缺省的,这时 SQL Server 自动为它生成一个名称。但在使用 ALTER TABLE 定义表级约束时,必须明确指定约束的名称。

2.FOREIGN KEY 外键约束

  • 通过外键( FOREIGN KEY )来建立和加强两个表数据之间的链接关系。
  • 外键约束可以引用另一表中的主键列,也可以引用另一表中具有 UNIQUE 约束的列,也就是说被参照列的值必须是唯一的(即具有 PRIMARY KEY 或 UNIQUE 约束)和非空的。
  • 外键约束也可以分为列级约束和表级约束。外键约束使用 FOREIGN KEY 指定引用的列,由 REFERENCES 子句指定被引用的表和列。
  • FOREIGN KEY 约束可以引用它自己所在表中的主键或唯一键,这种约束称为自我引用外键约束。当一个表存在自我引用时,必须非常注意记录插入的先后次序。被引用的记录必须先插入到表中,因为只有当它们已经存在于表中之后,其它引用它们的记录才能再插入进去。

3. UNIQUE 唯一约束

  • 一个表只能定义一个主键,如果需要在非主键列上也限制输入重复的值,可以使用 UNIQUE 约束。与 PRIMARY KEY 约束不同,一个表中可以定义多个 UNIQUE 约束,而且还允许为空值(允许存在一个空值)的列指定 UNIQUE 约束。
  • 在定义 UNIQUE 约束时会创建一个唯一性索引。这个索引可以是 CLUSTERED (聚集索引)或 NONCLUSTERED (非聚集索引),但如果在表中已经存在聚集索引时就不能建立CLUSTERED 索引。

4. CHECK (检验)约束

  • CHECK 约束用于定义列允许的格式和值,它通过限制列可接受的值,强制域的完整性。例如,通过创建 CHECK 约束可以把 salary 列的取值范围限制在 15000 至 100000 之间,从而保证输入的薪资值不超出这个范围。为此, CHECK 约束的逻辑表达式为CHECK (Salary >=15000 AND Salary <= 100000)
  • SQL Server 允许在一个列中定义多个 CHECK 约束,也允许通过创建表级 CHECK 约束,将一个 CHECK 约束应用于多个列。
  • CHECK 约束通常在建表时定义。对于数值型的列,其 CHECK 约束的逻辑表达式往往比较容易定义,而对于字符型的列,则往往需要使用 LIKE 或 IN 进行描述。
  • 有些 CHECK 约束在逻辑表达式中包含多个列,这时不能使用列级 CHECK 约束,而应该使用表级 CHECK 约束。表级约束条件可以在创建表时最后一列之后定义,也可以通过ALTER TABLE 语句添加进去。

5.DEFAULT 缺省约束

  • DEFAULT 约束用来定义列的缺省值(也称默认值)。如果在插入一条记录时没有为某一列显式提供值,则缺省值可以为该列指定一个值。如果列不允许空值且又没有 DEFAULT 定义,那就必须为该列显式指定值,否则 SQL Server 会返回错误信息。
  • 缺省值可以是计算结果为常量的任何值,例如常量、内置函数或数学表达式。通常我们可以将数字型列的缺省值指定为零,将字符串列的缺省值指定为空格。

6. NOT NULL (非空性)

  • 列的 为空性( Nullability )决定该列在表中是否允许空值。空值( NULL )并不等于零 (0) 、空格或零长度的字符串(即 ’’ ),空值是指值还没有确定或未被定义( unknown ),而零和空格都是已经明确的值。 例如, Products 表中 UnitPrice 列的空值并不表示该产品没有价格,而是指其价格未知或尚未确定。

补充说明

  • ALTER TABLE 的一种常见功能是向已存在的表中添加各类约束,如主键、外键、 CHECK约束、 DEFAULT 约束等,这类操作最主要的风险来自于新增的约束是否会对已有的数据行产生影响。
  • 在添加约束时可以使用 WITH CHECK 或 WITH NOCHECK ,指定新增的约束是否对表中原有的数据进行验证。如果不希望对原有数据进行约束验证,可以使用 WITH NOCHECK选项(这种做法是不值得提倡的,只有在极少应用中才会使用)。
    /* 增加一个主键约束,并对原有数据加以验证。/
    ALTER TABLE 表名 WITH CHECK
    ADD CONSTRAINT 约束名 PRIMARY KEY(列名);
    /
    增加一个 CHECK 约束,不对原有数据加以验证。*/
    ALTER TABLE 表名 WITH NOCHECK
    ADD CONSTRAINT 约束名 CHECK(列名 LIKE ‘[1-9][0-9][0-9][0-9]’)
    GO
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
数据完整性实验】实验完整代码 打开ScoreDB数据库,完成以下操作: (1)分别定义ScoreDB数据库中各基表的主键、外键,实现实体完整性约束和参照完整性约束; (2)往student表插入一条跟已有的学号相同的学生数据,验证实体完整性约束; (3)向score表中插入一条数据,其中数据中的课程编号是课程表中没有的,验证参照完整性约束; (4)修改score表中一条数据的课程编号,该编号是课程表中没有的,验证参照完整性约束; (5)删除student表中的一条数据(其中学号出现在score表中),验证参照完整性约束。 (6)增加score表的约束条件,要求成绩在0-100之间。增加student表的约束条件,要求性别只允许取“男”或“女”。 (7)创建一个触发器student_update,实现功能:如果在学生表中修改了学号,则自动修改成绩表中的学号。 (8)创建一个级联删除触发器student_delete。要求:当从学生表中删除某学生信息时,同时删除score表中此学生相关的选课记录。 (9)创建一个触发器student_insert,实现功能:如果往学生表中插入数据,则自动修改班级表中的班级人数classNum。(如果改为删除数据,代码要怎么改?) (10)建立一个触发器course_check,每当删除课程表中记录时,先检查此课程是否已被选修,如选修则不允许删除,且给出提示信息“此课程已有学生选修,无法删除!”。
近年来,在许多对安全至关重要的铁路应用(即铁路信号系统)中,铁路列车的基于卫星的定位是一种非常有吸引力的技术。 为了检测列车内部是否存在列车,控制中心需要进行列车完整性监控(TIM),在该中心,有效地更新了该列车与目标前方列车之间的安全距离。 传统TIM解决方案的成本效率和自主能力无法满足未来铁路系统(即下一代火车控制系统)的要求。 因此,基于GNSS(全球导航卫星系统)的列车完整性监控体系结构和相应的算法受到越来越多的关注。通过HoT(火车头)和EoT(火车尾)单元的火车前端,并使用定位结果确定火车的完整性状态。 由于EoT装置的运行条件具有挑战性,因此在受约束的观察环境下EoT装置的准确和可靠的定位得到了集中。 航迹图数据库和低成本惯性传感器耦合在EoT单元中。 我们使用虚拟卫星观测资料来研究GNSS星座图的改进和增强的自治接收机完整性监控(RAIM)。 为了进一步提高EoT定位的性能,惯性测量和航迹图数据与非线性滤波器结合使用。提出的解决方案的优点是利用航迹图中的航迹坐标的先验知识来改善定位在挑战性的运行条件下,EoT单元的性能可确保TIM的可用性和正确性。 所提出的解决方案已通过来自中国青藏铁路的现场数据进行了测试。 结果说明了所提出解决方案的能力,并从轨道图数据库验证了积极效果,这可以为使用GNSS的下一代列车控制系统的开发和实施提供强大的支持。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值