sql数据库完整性约束
完整性约束
z Insert、 delete、update
数据库系统概念----高级SQL
20
完整性控制
create trigger trigger-name insert
begin after
delete
on table-name
update [of column-name]
referencing
数据库系统概念----高级SQL
15
完整性控制
– 域约束的创建、撤消与添加
create domain AGE_DOMAIN smallint constraint DC_AGE check(value <= 25 and value
>= 15) alter domain AGE_DOMAIN
add constraint DC_AGE check(value <= 35 and value >= 15) alter domain AGE_DOMAIN
insert into loan values(nrow.account-number,
nrow.branch-name, – nrow.balance);
update account set balance = 0
where account.account-number = nrow.account-number
– 如果关系R2的外部码Fk与关系R1的主码Pk相对应,则R2 中的每一个元组的Fk值或者等于R1 中某个元组的Pk 值,或者为空值
– 意义:如果关系R2的某个元组t2参照了关系R1的某 个元组t1,则t1必须存在
– 例如关系S在Dno上的取值有两种可能
空值,表示该学生尚未分到任何系中;若非空值,则必须是DEPT关
第5章sql数据库完整性约束
5.2.4 默认值(DEFAULT)约束
默认约束是指在用户未提供某些列的数据时,数据库 系统为用户提供的默认值。从而简化应用程序代码和提高 系统性能。 表的每一列都可包含一个DEFAULT定义。可以修改或 删除现有的DEFAULT定义,但必须首先删除已有的 DEFAULT定义,然后通过新定义重新创建。 1.利用Management Studio定义(删除)default约束 步骤1:右键要建立default约束的表选择“修改”。 步骤2:在弹出的窗口中对应字段的“默认值或绑定”处 输入默认值。 步骤3:点击保存即可。
PRIMARY KEY约束在表中定义一个主键,唯一的标 识表中的行。一个表只能有一个PRIMARY KEY约束。
当向表中的现有列添加PRIMARY KEY约束时,SQL Server将检查列中现有的数据以确保现有数据遵从主键的 规则,即无空值、无重复值。 每个表都应有一个主键。主键可以是一列或列组合。
CREATE TABLE kc_new (5-4)
(课程号 CHAR(4) NOT NULL CONSTRAINT pk_kch1 PRIMARY KEY, 课程名 CHAR(16) NOT NULL CONSTRAINT ix_kcm1 UNIQUE,
学分 SMALLINT,
使用SQL对数据进行完整性控制
使用SQL对数据进行完整性控制(3类完整性、CHECK短语、CONSTRAIN子句、触发器)。
用实验证实,当操作违反了完整性约束条件时,系统是如何处理的。
根据以下要求认真填写实验报告,记录所有的实验用例。
3类完整性
1.实体完整性:
(列级约束条件)
当操作违反了完整性约束条件时:
检查主码的各个属性是否为空,只要有一个为空就拒绝插入;
检查主码值是否唯一,如果不唯一则拒绝插入;
2.参照完整性:
当操作违反了完整性约束条件时:
①sc表中增加一个元组,该元组的sno属性值在表student中找不到一个元组,其sno属性值与之相等;(系统拒绝)
②sc表中修改一个元组,修改后该元组的sno属性值在表student中找不到一个元组,其sno 属性值与之相等;(系统拒绝)
③从student表中删除一个元组,造成sc表中某些元组的sno属性值在表student中找不到一个元组,其sno属性值与之相等;(系统拒绝/级联删除/设置为空值)
④从student表中修改一个元组,造成sc表中某些元组的sno属性值在表student中找不到一个元组,其sno属性值与之相等;(系统拒绝/级联删除/设置为空值)
3.用户定义的完整性:
列值非空、列值唯一、检查列值是否满足一个条件表达式(check短语)
当往表中插入元组或修改属性的值时,关系数据库管理系统将检查属性上的约束条件是否被满足,如果不满足则操作被拒绝执行:
Check语句并没有起约束作用:(在MySQL中check子句会被分析,但是是忽略的)
CONSTRAIN子句
触发器。
第五章-完整性约束
第五章-完整性约束⽬录1. 概述数据库的完整性指数据的正确性(correctness)和相容性(compat-ability)。
正确性:指数据符合现实语义。
相容性:指同⼀对象在不同关系表中的数据是符合逻辑的。
为了维护数据库的完整性,数据库管理系统(DBMS)必须实现如下功能:定义完整性约束在SQL标准中定义了⼀系列定义完整性约束的语句。
完整性检查检查数据是否符合完整性约束条件的机制成为完整性检查。
完整性检查通常在INSERT、UPDATE、DELETE语句执⾏后开始检查,也可在事务提交时检查。
违约处理在DBMS发现⽤户的操作违背了完整性约束条件,将采取⼀定的操作。
关系数据库管理系统使得完整性控制成为其核⼼⽀持的功能,从⽽能为所有⽤户和应⽤提供⼀致的数据库完整性。
数据库完整性主要分为:实体完整性、参照完整性和⽤户定义完整性。
在下⽂中,我将逐⼀介绍上述三类完整性,并且还会介绍⼀些SQL中定义的⼀些特性。
2. 实体完整性定义实体完整性⽰例:CREATE TABLE Student(Sno CHAR(9) PRIMARY KEY, -- 在列⼀级定义主码Sname CHAR(20),Ssex CHAR(2),Sage SMALLINT,Sdept CHAR(20)PRIMARY KEY(Sno) -- 在表⼀级定义主码);实体完整性检查和违约处理使⽤PRIMARY KEY短语定义关系的主码后。
每当⽤户插⼊或更新记录时,DBMS都会⾃动进⾏实体完整性检查:检查主码是否唯⼀,若不唯⼀便拒绝插⼊或修改。
检查主码的各个属性是否为空,若存在为空便拒绝插⼊或修改。
3. 参照完整性关系模型的参照完整性在创建表时使⽤FOREIGN KEY短语定义参照关系。
定义参照完整性⽰例:CREATE TABLE SC(Sno CHAR(9) NOT NULL,Cno CHAR(4) NOT NULL,Grade SMALLINT,PRIMARY KEY (Sno, Cno),FOREIGN KEY (Sno) REFERENCES Student(Sno), -- 定义表级参照完整性FOREIGN KEY (Cno) REFERENCES Student(Cno) -- 定义表级参照完整性);参照完整性检查如你所知,参照完整性将两个表中相应的元组联系起来。
第5章 完整性约束定义
2. 实体完整性
实体完整性是指保证表中所有的行唯一。实体完整性要求表中 的所有行都有一个唯一标识符。这个唯一标识符可能是一列, 也可能是几列的组合,称之为主键。也就是说,表中主键在所 有行上必须取值唯一。强制实体完整性的方法有:索引、 UNIQUE约束、PRIMARY KEY约束或 IDENTITY属性 。
参照完整性也叫引用完整性。参照完整性总是保证主关键字 (被引用表)和外部关键字(引用表)之间的参照关系。它涉 及两个或两个以上表数据的一致性维护。
2
3. 参照完整性
5.4.2
数据完整性实施方法
1. 声明型数据完整性 声明型数据完整性一般在对象创建时定义,由SQL Server强制 实施,通常使用约束、缺省值和规则来实现。实现基本数据完 整性的首选方法是使用声明型数据完整性。 声明型数据完整性作为数据库对象说明的一部分在语法中实现, 在CREATE TABLE和ALTER TABLE定义中使用CONSTRAINT、 DEFAULT等语句限制表中的值。使用这种方法实现数据完整性 简单且不易出错,系统直接将实现数据完整性的要求定义在表 和列上。 过程型数据完整性是指由某个过程引发而实施的数据完整性。 一般先写出实施数据完整性的条件,再写出强制该条件所执行 的用于保证数据完整性的脚本。通常由触发器和存储过程实现。 过程型数据完整性也可以在客户机和服务器上使用其它编程语 言和工具实现。
3
2. 过程型数据完整性
5.4.3 约束
1.约束的定义和类型
约束是SQL Server提供的自动保持数据库完整性的一种方法 。
列级约束:列级约束是行定义的一部分,只能够应用在一列上。
表级约束:表级约束的定义独立于列的定义,可以应用在一个表 中的多列上。
数据库中的数据完整性与一致性约束
数据库中的数据完整性与一致性约束数据完整性和一致性是数据库设计与管理中非常重要的概念。
通过在数据库中应用各种约束条件,可以保障数据的准确性、完整性和一致性。
本文将介绍数据库中数据完整性和一致性约束的概念、作用、实现方式以及相关的最佳实践。
一、数据完整性约束的概念与作用数据完整性是指数据库中数据的准确性和一致性。
数据库中的数据应该符合预先定义的规则和条件,以确保数据的有效性和可靠性。
数据完整性约束是用于限制数据库中数据的输入、更新和删除操作,以保持数据的完整性。
数据完整性约束的作用是:1. 防止非法数据的插入:通过限制输入数据的规则和条件,可以避免不符合要求的数据被插入到数据库中。
2. 保证数据的一致性:通过定义数据之间的关系和依赖,可以保证数据在更新、删除操作时的一致性,避免数据的冲突和矛盾。
3. 提高数据质量和可靠性:数据完整性约束可以帮助用户更好地管理和使用数据库,提高数据的质量和可靠性。
二、数据完整性约束的实现方式数据库中的数据完整性约束可以通过以下几种方式实现:1. 主键约束:主键是一个可以唯一标识数据库表中每一行数据的字段或字段组合。
主键约束要求主键值唯一且非空,通过主键约束可以保证数据的唯一性和完整性。
2. 外键约束:外键是一个表中的字段,它与另一个表中的主键字段相关联。
外键约束要求外键值必须在关联表中存在,通过外键约束可以保证数据的一致性和完整性。
3. 唯一约束:唯一约束要求某个字段的值在整个表中必须唯一,通过唯一约束可以防止重复数据的插入和更新。
4. 默认值约束:默认值约束可以在插入新数据时,对某个字段设置默认值,确保数据的完整性。
5. 检查约束:检查约束是对某个字段的值进行规则验证,只有符合条件的数据才能被插入和更新。
三、数据一致性约束的概念与作用数据一致性是指数据库中的数据在任何时刻都满足特定的条件和规则,数据之间的关系和依赖保持一致。
数据一致性约束是用于维护数据一致性的规则和条件。
基于SQL Server数据库完整性约束的几点探讨
保证一个表 中的每一行必须是唯一 的 ( 元组的唯一性) 为 。 保 证实体完整性 , 需指 定一个表 中的一列或一组列作为它的主 键 (r m r e ) 一个表中每行的主键 必须确实含有 一个值。 P i ay k y 。
一
立即约 束和推迟 ( e t 约束 、 到 o) 状态约束和状态演变约 束。但 在实际 的系统中, 一般将数据完整性约束分为标准的数据完整
个表只 能含有一个主键 , 如需要从其它列中除去重复的值 ,
办 公 自动化杂 志 ・2 ・ 5
维普资讯
20年 1月 06 1 总第 9 3期
可 以将一个或 一组非主键列指定为一个候 选键 或唯 值 键 。 () 3 引用完整性 (e e e c n er t ) R fr n e it g i y
Wa g n Ho g in n xa g
( ct nl ehC l g i nn n ier g& T cn lg iesy F xn 0 0、 Vo a o a T c ol e La igE g ei i e o n n eh oo yUnv rt u i 13 0 i 2
Ab ta t h tgi srit f aa a ei ted sg O ec ne t f tI d ent nya e th blyo ted tb s , u loa e t sr c T ei e ryr t n d tb s e inC T o tn i.t o s ’o l f c ea it fh aa a e b t s f cs n t e a o sh o t i a
关键词 SL S r e 数据库 完 整性 约束 O e vr
S v r l s u so so h n e rt sr i tBa e e e a c s i n n t e I t g i Re t a n s d Di y
关系数据库的完整性约束
关系数据库的完整性约束关系数据库是一种常用的数据库模型,它使用表格来存储和组织数据。
在关系数据库中,完整性约束是一种重要的机制,用于确保数据的一致性和准确性。
本文将介绍关系数据库的完整性约束的定义、类型以及它们在数据库设计和数据管理中的作用。
一、完整性约束的定义完成性约束是指定义在关系数据库表上的规则,用于保证数据的完整性。
它可以限制某些列的取值范围、规定表之间的关系、强制规则和业务规则等。
通过定义完整性约束,可以防止不一致、不准确或不符合业务规则的数据进入数据库。
二、完整性约束的类型1. 实体完整性约束实体完整性约束用于确保每一行数据在主键列上具有唯一的值,并且不为空。
主键是关系数据库中用于唯一标识每一行数据的列或列组合。
2. 引用完整性约束引用完整性约束用于确保表之间的关系的一致性。
它结合了外键和主键的概念,确保在外键列中的值必须在参照表的主键列中存在。
这样可以防止不一致的关系建立或错误的数据引用。
3. 域完整性约束域完整性约束用于限制某些列的取值范围。
可以通过定义数据类型、长度、格式等约束来确保数据的准确性和一致性。
4. 用户自定义完整性约束用户自定义完整性约束是根据特定业务需求定义的约束规则。
可以使用触发器、存储过程或触发器等数据库对象来实现自定义完整性约束。
5. 断言完整性约束断言完整性约束是在SQL标准中定义的,用于在关系数据库中表示某种条件必须成立。
断言可以在表创建时定义或随后添加,以确保数据满足特定条件。
三、完整性约束的作用1. 数据的一致性和准确性:通过完整性约束,可以限制数据的取值范围和关系,确保数据的准确性和一致性。
2. 数据的安全性:完整性约束可以防止数据被非法篡改、删除或插入不符合规定的数据。
3. 业务规则的保护:通过完整性约束,可以确保数据库中存储的数据符合特定的业务规则。
4. 避免错误的数据关联:引用完整性约束可确保外键的合法性,防止不一致的数据关联。
5. 数据的可靠性和可维护性:通过定义完整性约束,可以为数据库提供可靠的结构和规范,便于数据的管理和维护。
sql完整性约束
sql完整性约束课本中把完整性约束单独做成⼀章来讲解,所以之前写数据定义之基本表定义时说会放到后⾯讲。
完整性约束有三种:实体完整性,参照完整性,⽤户定义完整性。
最后会讲完整性约束命名⼦句,所以⼀共四个部分。
Part [实体完整性]实体完整性即主码,⽤primary key定义。
可⽤两种⽅式:列级约束:create table test (id int primary key); 只能选取⼀列作为主码;表级约束:create table test (id int,name char(10),primary key(id,name)); 可选多列作为主码;Part [参照完整性]参照完整性即外码,⽤foreign key(<列名>[,<列名>...]) references <表名>(<列名>[,<列名>..]);⽽且只能使⽤表级约束。
现在以上⾯那个截图中的表为参照,建⽴另⼀个表 注意:外码⼀定参照主码(可以是其他表的主码,也可以时⾃⼰的),⽽且外码的列数⼀定要等于被参照表的主码列数。
参照完整性中⽐较⿇烦的是违约处理,即当对被参照表进⾏update/delete/insert操作会破坏参照完整性时,参照表赢告诉被参照表应该怎么做。
所以参照表可以在定义外码时添加上on delete/update [<no action> / <cascade>]。
看例⼦⽐较直观: 其中no action 表⽰拒绝执⾏(为默认值),cascade表⽰级联操作。
Part [⽤户定义完整性]书中的⽤户定义完整性有三种:列值⾮空(not null),列值唯⼀(unique),列值需满⾜条件表达式(check);not null都是列级完整性约束,很好理解。
check和unique可以是列级,也可以是表级约束。
看例⼦很⽅便理解: 除了这三种,现在的sql产品中很多都⽀持⼀个设置默认值的操作(default); 如果不设置,默认为NULL(not null,primary key除外)。
SQL入门(3):定义约束断言assertion触发器trigger
SQL⼊门(3):定义约束断⾔assertion触发器trigger 本⽂介绍数据库的完整性完整性控制程序: 指定规则,检查规则(规则就是约束条件)动态约束 intergrity constraint::=(O,P,A,R)O : 数据集合, 约束的对象 ?: 列, 多列的元组集合P: 谓词条件: 什么样的约束?A: 触发条件: 什么时候检查?R: 响应动作: 不满⾜怎么办?按照约束对象分类:(1)域完整性约束条件: 施加在某⼀列上, ⽐如sage<25 and sage<40(2)关系完整性约束条件: 施加在表上, 涉及多列, 2<=hours/credit<=16按照约束来源分类:(1)结构约束: 主键约束, 外键约束,是否允许空值等 primary key, foreign key, not null(2) 内容约束: 取值范围, check(sage<25 and sage<40)按照约束状态分类:(1) 静态约束: 要求DB在任何时候都要满⾜的约束(2) 动态动态: DB改变状态时要满⾜的约束, 例如salary 只能加不能减, 不能由1000改为500.---> 触发器SQL⽀持如下⼏种约束:静态约束中的列完整性与表完整性, 动态约束中的触发器(⼀) 静态约束实现: create table(1) col_constr 列约束 (⼀种域约束类型, 对单⼀列的值进⾏约束)not null 列值⾮空primary key 主键not null + unique 就是⾮空+唯⼀性 ,实际上就是⼀个主键check (search_condition) 列值满⾜的条件,references tablename(colname) , colname 是tablename 的主键on delete[ cascade| set null], 则删除被引⽤表的某⼀列v值时, 要将本表该列值为v 的记录删除或者列值更新为null, 缺省为⽆操作.例: 创建⼀个表 studentcreate table student (sno char(8) not null unique, sname char(10),--not null unique 表⽰主键ssex char(2) constraint ctssex check(ssex='男'or ssex='⼥'),-- ctssex 是约束constraint 的名字. 之后可以单独处理sage integer check(sage>=1and sage<150), -- 没有定义约束名, 则之后不能单独处理dno char(2) references dept(dno) on delete cascade, -- dno 在dept表中是主键,sclass char(6));on delete cascade表⽰如果dept表中的某个'01'系被删除了,那么在student 表中该系所有学⽣的dept 值为null, 如果没有加这个, 那么dept表中的删除操作对student表没有影响.create table course (cno char(3), cname char(10), chours integer,credit float(1) constraint ctcredit check(credit>=1.0and credit <=6.0),tno char(3) references teacher(tno) on delete cascade);-- 或者通过alteralter table course add constraintcs_tno foreign key(tno) references teacher(tno) on delete cascade;-- 移除约束alter table course drop constraint cs_tno;补充: unique 和not nullcreate table tbl1(name1 varchar(10), num1 varchar(10),constraint cs_num1 unique(num1));-- 或者create table tbl1(name1 varchar(10), num1 varchar(10) unique);-- 之后再添alter table tbl1 add constraint cs_num1 unique(num1);alter table tbl1 drop constraint ;-- ⾮空约束create table tbl1(name1 varchar(10), num1 varchar(10) not null);-- 新增⾮空约束alter table tbl1 modify num1 not null;-- 删除⾮空约束不是⽤dropalter table tbl1 modify num1 null;(2) table_constr 表约束, ⽤于多列或者元组的值进⾏约束create table student ( sno char(5) not null unique,sname char(5),ssex char(2) constraint ctssex check(ssex='男'or ssex='⼥') ,sage integer check(sage>1and sage<150).dno char(3) references dept (dno) on delete cascade,sclass char(5),primary key(sno));--primary key(sno) 可以放在sno 这⼀列的后⾯, 也可以放在最后这⾥, 看成是表约束create table course (cno char(3), cname char(10), chours integer,credit float(1) constraint ctcredit check(credit>=1.0and credit <=6.0),tno char(3) references teacher(tno) on delete cascade,primary key (cno), constraint ctcc check(chours/credit=12));-- 严格约束12课时对应1个学分create table sc(sno char(5), cno char(3),score float(1) constraint ctscore check(score>=0.0and score<=100.0),foreign key(sno) references student(sno) on delete cascade,foreign key(cno) references course(cno) on delete cascade);注意: check 后⾯的条件可以是select from where 语句create table sc(sno char(5) check (sno in (select sno from student)),cno char(3), check(cno in (select cno from course)), --相当于外键score float(1) constraint ctscore check(score>=0.0and score<=100.0);注意: create table 中的约束条件可以在后⾯根据需要进⾏撤销 ,也可以追加约束alter table tablename +add 追加约束, 也可以增加新的⼀列drop 删除⼀列的约束,或者删除⼀列,modify 修改alter table sc drop constraint ctscore; -- 撤销对score的约束ctscore;alter table scmodify ( score float(1) constraint nctscore check(score>0.0and score<=150.0));-- 修改约束alter table scadd ( score float(1) constraint nctscore check(score>0.0and score<=150.0));-- 增加约束(3) 断⾔ assertion⼀个断⾔就是⼀个谓词表达式, 它表达了希望数据库总能满⾜的条件, 表约束与列约束就是⼀些特殊的断⾔.还有复杂的断⾔ create assertion [assertion name] check [predicate]那么之后数据库的每⼀次更新去判断是否违反该断⾔, 断⾔测试增加了数据库维护的负担, 没事不要使⽤!! 例如: 每位教师同⼀时间段不能在两个不同的地⽅上课.实例1: 已知下列4张表borrower(client_name,loan_num)客户以及他的贷款account(account_num,balance) 账户和余额depositor(account_num, client_name) 账户与客户名loan(loan_num, amount) 每⼀笔贷款现在规定: 每⼀笔贷款 , 要求⾄少这个借款者的账户中有最低余额500元.create assertion balance_cst check(not exists (select*from loanwhere not exists (select*from borrower b, depositor d, account awhere loan.loan_num=b.loan_num andb.client_name=d.client_name anda.account_num=d.account_num and a.balance>=500)));实例2: 现有3张表account(branch_name, account_num, balance) 分⾏账户与余额loan(branch_name,loan_num,amount) 分⾏的每⼀笔贷款branch(branch_name,..) 分⾏信息每⼀个分⾏的贷款总量要⼩于该分⾏所有账户的余额总额 (不存在某⼀个分⾏它的贷款额⼤于余额) create assertion sum_cst check(not exists (select*from branch where (select sum(amount) from loanwhere loan.branch_name=branch.branch_name) >=(select sum(balance) from account where account.branch_name=branch.branch_name)));(⼆) 动态约束以上 create table 中的表约束与列约束是静态约束, 下⾯介绍动态约束-->触发器 trigger动态约束是⼀种过程完整性的约束, 相⽐之下, 之前的create table 的约束是⾮过程性约束动态约束是⼀个程序, 该程序可以在特定的时刻被⾃动触发执⾏: ⽐如在⼀次更新之前,或者⼀次更新之后的执⾏.动态约束 intergrity constraint::=(O,P,A,R), O P A R 都需要定义, 再来回顾下O : 数据集合, 约束的对象 ?: 列, 多列的元组集合P: 谓词条件: 什么样的约束?A: 触发条件: 什么时候检查?R: 响应动作: 不满⾜怎么办?以下是Oracle 的触发器的语法例⼦, 在SQL server中语法略有差别, 但是思路⼀致. ..创建触发器的基本语法:create trigger trigger_namebefore| after [insert | delete|update] [of colname] on tablenamefor each row| for each statementwhen [search_condition][statement][begin atomic statement; ... end;] --多个条件注意: row , as 可以省略!实例(1):当teacher表更新元组时, 控制其⼯资只能涨不能跌create trigger teacher_sal-- 触发器名字before update of salary on teacher --作⽤在什么表的什么列referencing new x, old y -- 定义更新前后的值for each row when(x.salary<y.salary) -- 对每⼀条记录都要检查,begin--如果违反则执⾏raise_application_error(-20003,'invalid salary on update');-- Oracle的错误处理函数, 提⽰⽆效更新end;实例(2) : student(sno, sname, sumcourse), sumcourse 表⽰该同学已经学习的课程门数,初始值是0, 以后每修⼀门课都要对其+1, 设计⼀个触发器⾃动完成这个功能.create trigger sumcafter insert on sc -- 对于sc 的新增信息作出反应referencing new row newI-- 定义更新后的⾏=newifor each rowbegin-- 执⾏操作update student set sumsourse=sumcourse+1where sno=:newi.sno; -- 这条记录(⾏)对应的学号end;实例(3) :student(sno, sname, sage,ssex,scalss) 中某⼀个学⽣变动其主码sno,则在sc 表中该同学的学号也要相应改变create trigger upd_snoafter update of sno on student --指明更新的地⽅referencing old oldi, new newifor each rowbeginupdate sc set sno=newi.sno where sno=: oldi.sno;end;实例(4) :student(sno, sname, sumcourse)中删除某⼀个学⽣sno时, 在sc 中该学⽣的选课记录也要删除create trigger del_snoafter delete on studentreferencing old oldifor each rowbegindelete sc where sno=:oldi.sno;end;实例(5) : student(sno, sname, sumcourse)中删除某⼀个学⽣sno时, 在sc 中该学⽣的sno设置为null create trigger del_snoafter delete on studentreferencing old oldifor each rowbeginupdate sc set sno=null where sno=:oldi.sno;end;实例(6) :假设有两张表, dept(dno,dname,dean) ,该表字段是系号系名系主任名, 以及teacher(tno,tname,dno,salary) . 现在需要控制在对dept 的dean 做更新的时候,必须满⾜dean 的⼯资是同⼀系⾥最⾼的, 否则更新报错.create trigger dean_salbefore update of dean on dept -- 对dept 的dean 做更新的时候referencing old oldi , new newi -- 更新前后的新旧定义for each row when(dean not in(select tname from teacher where dno=:newi.dno and salary>=all(select salary from teacher where dno=:newi.dno )))-- 同系教师⼯资begin-- 不满⾜条件时raise_application_error(-20003,'invalid dean on update');end;。
《SQL Server》课程数据完整性约束的教学整体设计
3 . 2 参照 完整性
参照完整性通过外键约束实现. 例如 , 成绩表( 子表) 的“ 学号” 字段与学生表 ( 父表) 的“ 学号 ” 字段对 应, 其值引用学生表中“ 学号” 字段 的值 , 那么通过公共字段“ 学号” , 可以在成绩表和学生表之间建立关联 ; 同理 , 也可 以在 成绩表 和课 程表 之 间建 立关 联 . 可以使用 S Q L 语句 , 在创建数据表的同时定义外键约束. 如定义成绩表 : C r e a t e t a b l e 成绩表( 学号 C h a r ( 6 ) n o t n u l l f o r e i g n k e y( 学号) r e f e r e n c e s 学生表( 学号 ) , 课程号 C h a r ( 4 ) n o t n u l l f o r e i g n k e y( 课程号 ) r e f e r e n c e s 课程表 ( 课程号)p r i m a r y k e y ( 学号 , 课程号) , 成绩 d e c i m a l ( 6 , 1 ) ) 当然, 也可以使用 S Q L 语句 , 通过修改表结构来定义外键约束. a l t e r t a b l e成 绩表
字 段设 置惟 一约束 . 设计 如下 : C r e a t e t a b l e学生 表 ( 学号 C h a r ( 6 )n o t n u l l p r i ma r y k e y , 姓名 C h a r ( 8 )u n i q u e , 性别 C h a r ( 2 ) , 出生 日期 d a t e t i m e , 民族 V a r c h a r ( 2 0 ) )
对数据完整性约束 问题进行 了探讨和分析 , 同时 , 根据教务管理工作的特点 , 对教务管理系统的数据完整性 进行 了设计 , 并使之通过 S Q L S e r v e r 2 0 0 8 得到实现. 本文拟对这一教学实践做个总结.
数据库实验6 -数据完整性约束(表约束)
实验六数据完整性约束姓名:学号:专业:网络工程班级:20网络工程同组人:无实验日期:2022.5【实验目的与要求】1.熟练掌握实体完整性的实现。
2.熟练掌握参照完整性的实现。
3.熟练掌握域完整性的实现。
【实验内容与步骤】实验准备:(1)对于SalesDB数据库,若在产品表、销售表和客户表上已有约束,请先删除之;(2)删除掉表中重复的行。
6.1.实体完整性的实现(1) 对产品表,定义主键约束(用企业管理器实现)。
写出相应过程:(1)在对象资源管理器中的数据库节点下找到数据库SalesDB,找到表Product。
右击-修改(2)按住Ctrl键选中Price和Stocks,右键-设置主键-保存测试:试着对产品表插入一条与原表中数据行具有相同主键值的数据。
给出测试结果:(2)客户表(CUSTOMER),定义名为PK_Cstm的主键约束,设定客户号(Cno)为主键。
(用SQL语句实现,写出相应语句)。
给出相应的SQL语句:alter table Customeraddconstraint PK_Cstm primary key(Cno)给出测试结果:(3)对销售表,定义名为PK_Sales的主键约束,设定主键为(Pno,Cno)的组合(用SQL语句实现,写出相应语句)。
给出相应的SQL语句:alter table Salesaddconstraint PK_Sales primary key(Pno,Cno)给出测试结果:(1)利用企业管理器建立产品表(Product)与销售表(Sales)之间的参照关系,当对主表产品表进行更新和删除操作时,从表Sales采用NO ACTION方式,写出其过程。
给出相应的过程:测试:试着删除主表中与从表有关联的一条记录,而后分别查看主表和从表中数据记录,给出测试结果。
(2)利用SQL语句建立销售表(SALES)与客户表(CUSTOMER)之间的参照关系,设定外键约束名为FK_SC,使得当对主表客户表(CUSTOMER)进行更新和删除操作时,从表销售表(SALES)采用CASCADE(级联)方式处理,给出相应的SQL语句和测试结果。
实验三 完整性约束
实验三完整性约束实验三完整性约束实验3完整性约束一、1.2.3.4.实验目的理解主键、唯一键、外键、检查、默认和标识列的含义。
掌握用企业管理器创建unique、foreignkey、check、default约束;掌握用sql创建unique、foreignkey、check、default约束;掌握用sql创建identity属性列。
二、实验要求1.执行下发的sql文件,创建test数据库2.完成实验内容中的每一个主题,完成SQL语句,并粘贴问题后可以成功执行的SQL 语言句3.分离测试数据库并将测试数据库文件打包到test zip中4.将test.zip和实验报告电子稿一起打包成“学号姓名.zip”上交三、实验内容(一)执行下发的sql文件,创建test数据库(二)建表时创建约束1.使用SQL_uTCTABLE创建一个新的表测试,并设置主键。
用sql创建新表test_tc,并以列约束形式创建primarykey约束。
test_tc表的结构定义如下:表名:Test_uTC包含以下列:教师号:tnochar(2)课号:cnochar(2)主键:(tno,cno)主键约束名称:PK_u;test_uutcsql语句:usetestcreatetabletest_uuTC(tnochar(2)、cnochar(2),constraintpk_test_tcprimarykey(tno,cno))(三)在现有表中创建和删除约束2.用企业管理器为现有表test_tc中的cno和tno列创建“unique约束”3.用sql为现有表c中的cn列创建“unique约束”sql语句:usetest可改变的addconstraintunique_cunique(cn)4.使用enterprise manager测试现有表uSC添加新列ID SC并将此列属性创建为Identity 5使用SQL TC添加新列ID TC测试现有表并将此列属性创建为Identity SQL语句:usetestaltertabletest_tc额外身份6.在企业管理器中删除现有表test_sc的主键pk_test_sc和取消id_sc列的标认知属性7.用sql删除表c中cn列的unique约束unique_csql语句:usetest可改变的dropunique_c8.使用enterprise manager为现有表t创建默认值并检查约束。
SQL数据库约束、默认和规则
SQL数据库约束、默认和规则数据的完整性实体完整性⼜称为⾏完整性,即数据库中的所有⾏都具有⼀个⾮空且没有重复的主键值MSSQL中通过唯⼀索引、PRIMARY KEY约束、UNIQUE约束、INDENTITY属性等来强制主键的唯⼀性域完整性⼜叫列完整性,以保证列数据的输⼊具有正确的数据类型、格式和有效的数据范围强制域有效性可以通过限制数据类型、CHECK约束和规则、FOREIGN KEY、DEFAULT、NOTNULL定义参照完整性⼜叫引⽤完整性,旨在保证主表和从表数据的⼀致性,通过FOREIGN KEY和CHECK约束实现⽤户定义完整性⽤户定义的不属于以上完整性的特点那个规则SQL数据库约束、默认和规则1)约束 CONSTRAINT实现约束的五种⽅式:(1) CHECK约束[CONSTRAINT 约束名] CHECK (逻辑表达式)CREATE TABLE 成绩(学号 char(8) NOT NULL,CONSTRAINT ck_cj CHECK (成绩>=0 and 成绩<=100))ALTER TABLE 成绩ADD CONSTRAINT ck_cj (成绩>=60 and 成绩<=100)ALTER TABLE 成绩DROP CONSTRAINT ck_cj(2)PRIMARY KEY约束[CONSTRAINT 约束名] PRIMARY KEY [CLUSTERED] [NONLUSTERED]CREATE TABLE 学⽣(学号 char(8) NOT NULL CONSTRAINT pl_xs PRIMARY KEY CLUSTERED)ALTER TABLE 学⽣ADD CONSTRAINT pk_xs PRIMARY KEY CLUSTERED(学号)(3)FOREIGN KEY约束 references[CONSTRAINT 约束名] FOREIGH KEY (从表外键) PEFERENCES 主表 (主表外键)CREATE TABLE 成绩(学号 char(8) NOT NULL FOREIGN KEY REFERENCES 学⽣ (学号))(4)UNIQUE约束[CONSTRAINT 约束名] UINQUE [CLUSTERED\NONCLUSTERED](列名...)CREATE TABLE 职⼯(⾝份证号 char(18) NULL CONSTRAINT uni_sfz UNIQUE)(5)DEFAULT约束[CONSTRAINT 约束名] DEFAULT 默认约束值 FOR 列名CREATE TABLE 学⽣(性别 char(2) DEFAULT '男')默认[DEFAULT]默认是⼀种数据库对象,可以绑定在⼀列或者多列上,作⽤与DEFAULT约束相似,在插⼊数据⾏时,为没有指定数据的列提供实现定义的默认值创建默认对象CREATE DEFAULT 默认对象名 AS 默认值USE 学⽣成绩CREATE DEFAULT sex_mr AS '男'绑定默认对象sp_bindefault [@defname=] '默认对象名' [@objname] '绑定的列名'use 学⽣成绩goexec sp_bindefault 'sex_mr','学⽣.性别'删除绑定sp_unbindefault [@objname=] '绑定的列名'use 学⽣成绩goexec sp_unbindefault '学⽣.性别'删除默认对象DROP DEFAULT 默认对象名use 学⽣成绩godrop default sex_mr规则(RULE)规则也是⼀种数据库对象,可以绑定在⼀列或多列上,作⽤与CHECK约束相似,在插⼊数据⾏时,指定接收的数据值的范围创建规则CREATE RULE 规则名 AS 规则条件USE 学⽣成绩gocreate rule cj_rl as @cj>=0 and @cj<=100绑定规则sp_bindrule [@rulename=] '规则对象名' [@objname] '绑定的列名' use 学⽣成绩goexec sp_bindrule 'cj_rl','成绩.成绩'删除规则sp_unbindrule [@objname=] '绑定的列名'use 学⽣成绩goexec sp_unbindrule '成绩.成绩'删除规则对象DROP RULE 规则对象名use 学⽣成绩godrop rule cj_rl。
数据库实验4-数据完整性控制
5.触发器 触发器可以看成是一类特殊的存储过程,在满足某个特定条件时自
动触发执行,是提高数据库服务器性能的有力工具。 触发器分为三类,更新触发器、插入触发器和删除触发器。 能够定义触发器的用户有表的所有者、系统管理员、拥有创建触发
器权限且拥有对操作对象相应操作权限的用户。 1) 定义表TAB,并在其上定义触发器TR1,在对TAB的插入和更新前
SAGE NUMERIC(3) CONSTRAINT C4 CHECK(SAGE<30),
CONSTRAINT STUDENTKEY PRIMARY KEY(SNO) );
2) 修改表student中的完整性约束,去掉对性别的限制,并将对年龄 的限制由小于30改为小于40。
ALTER TABLE STUDENT DROP CONSTRAINT C3; ALTER TABLE STUDENT DROP CONSTRAINT C4; ALTER TABLE STUDENT ADD CONSTRAINT C4 CHECK(SAGE<40);
的值只允许取“男”或“女”;定义表sc,属性GRADE的值在0~100之 间 Student表和sc表的其他信息参加上面的例子 4) 用户定义的元组上约束条件 CHECK短语不仅能够定义属性上的约束条件,而且还能允许用户 定义元组级的约束条件。 定义表student,要求当学生性别为男时,其名字不能以Ms.打头。其 他信息如之前的例子。 4.CONSTRAINT完整性约束命名子句 在定义表时利用约束命名子句对完整性约束条件命名,能够灵活地 增加或删除一个完整性约束条件。 1) 定义表student,要求学号在90000~99999之间,姓名不能取空值, 年龄小于30,性别只能是“男”或“女”。要求全部用约束命名子句 实现,主码约束也要用约束命名子句实现,列信息见之前例子 2) 修改表student中的完整性约束,去掉对性别的限制,并将对年龄 的限制由小于30改为小于40。
SQL中主键、外键完整性约束的作用以及创建语句
SQL中主键、外键完整性约束的作用以及创建语句SQL的主键和外键约束SQL的主键和外键的作用:外键取值规则:空值或参照的主键值。
(1)插入非空值时,如果主键表中没有这个值,则不能插入。
(2)更新时,不能改为主键表中没有的值。
(3)删除主键表记录时,你可以在建外键时选定外键记录一起级联删除还是拒绝删除。
(4)更新主键记录时,同样有级联更新和拒绝执行的选择。
简而言之,SQL的主键和外键就是起约束作用。
关系型数据库中的一条记录中有若干个属性,若其中某一个属性组(注意是组)能唯一标识一条记录,该属性组就可以成为一个主键。
比如:学生表(学号,姓名,性别,班级)其中每个学生的学号是唯一的,学号就是一个主键;课程表(课程编号,课程名,学分)其中课程编号是唯一的,课程编号就是一个主键;成绩表(学号,课程号,成绩)成绩表中单一一个属性无法唯一标识一条记录,学号和课程号的组合才可以唯一标识一条记录,所以,学号和课程号的属性组是一个主键。
成绩表中的学号不是成绩表的主键,但它和学生表中的学号相对应,并且学生表中的学号是学生表的主键,则称成绩表中的学号是学生表的外键;同理,成绩表中的课程号是课程表的外键。
定义主键和外键主要是为了维护关系数据库的完整性,总结一下:一、主键是能确定一条记录的唯一标识,比如,一条记录包括身份正号,姓名,年龄。
身份证号是唯一能确定你这个人的,其他都可能有重复,所以,身份证号是主键。
外键用于与另一张表的关联。
是能确定另一张表记录的字段,用于保持数据的一致性。
比如,A 表中的一个字段,是B表的主键,那他就可以是A表的外键。
二、主键、外键和索引的区别定义:主键--唯一标识一条记录,不能有重复的,不允许为空外键--表的外键是另一表的主键, 外键可以有重复的, 可以是空值索引--该字段没有重复值,但可以有一个空值作用:主键--用来保证数据完整性外键--用来和其他表建立联系用的索引--是提高查询排序的速度个数:主键--主键只能有一个外键--一个表可以有多个外键索引--一个表可以有多个唯一索引创建SQL的主键和外键约束的方法:create table Student --建表格式:create table 自定义的表名( --字段名一般为有一定意义的英文StudentName nvarchar(15), -- 格式:字段名类型()括号里面的是允许输入的长度StudentAge int, --int型的后面不需要接长度StudentSex nvarchar(2) --最后一个字段后面不要逗号)--在创建表时就可以对字段加上约束:create table Student(StudentNo int PRIMARY KEY IDENTITY(1,1), --加主键约束,还有标识列属性(两者构成实体完整性)StudentName nvarchar(15) not null, --加非空约束,不加"not null" 默认为:可以为空StudentSchool text(20) FOREIGN KEY REFERENCES SchoolTable(SchoolName), --加外键约束,格式:FOREIGN KEY REFERENCES 关联的表名(字段名)StudentAge int DEFAULT ((0)), --加默认值约束StudentSex nvarchar(2) CHECK(StudentSex=N'男' or StudentSex=N'女') --加检查约束,格式:check (条件表达式))--如果在表创建好了以后再加约束,则格式分别为:-- 主键:alter table 表名add constraint PK_字段名--"PK"为主键的缩写,字段名为要在其上创建主键的字段名,'PK_字段名'就为约束名primary key (字段名) --字段名同上--唯一约束:alter table 表名add constraint UQ_字段名unique (字段名)--外键约束:alter table 表名add constraint FK_字段名--"FK"为外键的缩写foreign key (字段名) references 关联的表名(关联的字段名) --注意'关联的表名'和'关联的字段名'alter table 表A add constraint FK_B foreign key (ticket_no) references 表B(ticket_no)alter table 表A add constraint FK_C foreign key (person_no) references 表C(person_no)alter table 成绩表add constraint FK_StudentNo foreign key (StudentNo) references Student (StudentNo)ON UPDATE CASCADE ON DELETE CASCADE级联更新,级联删除,这样在删除主表Student时,成绩表中该学生的所有成绩都会删除。
数据库实验-数据完整性约束
广州XX学院数据库管理及应用实验报告专业班级计算机181 实验日期2020.4.18 姓名李XX 学号2018132 实验名称数据完整性约束指导教师王琢(报告内容包括实验目的、实验设备及器材、实验内容、实验步骤、实验结果、实验小结等)一、实验目的(1)理解数据完整性约束概念。
(2)掌握SQL Server的数据完整性约束技术。
(3)了解SQL Server的违反数据完整性约束的处理措施。
二、实验设备及器材Windows平台、SQL Server 2012。
三、实验内容4.1在数据库EDUC中创建下列完整性约束。
1)为数据库Course_info创建CHECK约束:当插入或修改一个记录时确保此记录的授课学时在10-80。
2)为教师信息表Teacher_info创建CHECK约束:男教师的出生日期在1960年1月1日后,女教师的出生日期在1965年1月1日后。
3)为教师上课信息表TC_info创建CHECK约束:学生成绩在0-100。
4)为教师上课信息表TC_info创建外键约束:tcid、tno、classno和cno。
4.2在数据库TSGL中创建下列完整性约束。
1)创建CHECK约束:readers表的RederType在0-9。
2)利用SSMS删除readers表的约束。
3)创建主键约束:为readers表的字段ReaderID添加主键。
4)创建多个字段的主键:为borrowinf表的ReaderID、BookID字段定义主键。
四、实验步骤4.11)为数据库Course_info创建CHECK约束:当插入或修改一个记录时确保此记录的授课学时在10-80。
USE EDUCGOALTER TABLE Course_infoWITH NOCHECK ADD CONSTRAINT CK_lecture CHECK(lecture>=10 AND lecture <=80)GO2)为教师信息表Teacher_info创建CHECK约束:男教师的出生日期在1960年1月1日后,女教师的出生日期在1965年1月1日后。
数据库实验报告完整性约束
海事大学数据库原理课程实验大纲实验名称:实验七完整性实验学时: 2适用专业:智能科学与技术实验环境: Microsoft SQL server 20141实验目的(1)掌握实体完整性、参照完整性和用户自定义完整性约束的创建方法。
(2)掌握完整性约束的运行检查机制。
(3)掌握参照完整性的级联删除和修改方法。
(4)掌握正确设计关系模式完整性约束的方法。
2实验容2.1 掌握实体完整性约束的创建和使用方法(1)创建表时定义由一个属性组成的主键(给约束命名)。
(2)创建表时定义由两个或两个以上属性组成的主键(给约束命名)。
(3)删除以上两个主键约束。
(4)利用ALTER TABLE语句定义上述两个主键。
2.2 掌握参照完整性约束的创建和使用方法(5)创建表时定义一个列级参照完整性约束(给约束命名)。
(6)创建表时定义一个表级的由两个属性组成的参照完整性约束(给约束命名)。
(7)设计数据更新语句检查参照完整性约束是否起作用。
(8)删除上述完整性约束。
(9)利用ALTER TABLE 建立上述参照完整性约束,并且规定UPDA TE/DELETE时的动作。
(10)设计数据更新语句检查参照完整性约束及其相应的动作是否起作用。
2.3 掌握用户自定完整性约束的创建和使用方法(11)定义一个检查约束,检查其值在某个取值围,并设计相应的更新语句检查该约束是否起作用?(12)定义一个检查其值符合某个匹配模式的检查约束(使用LIKE),并设计相应的更新语句检查该约束是否起作用?(13)定义一个检查其值符合某个正则表达式的检查约束(使用SIMILAR TO),并设计相应的更新语句检查该约束是否起作用?(14)定义一个UNIQUE约束,并设计相应的更新语句检查该约束是否起作用?(15)定义一个DEFAULT约束,设计一个INSERT语句检查该约束是否起作用。
3实验要求(1)深入复习教材第五章数据库完整性约束容。
(2)根据书上的例子,针对TPCH数据库模式设计各种完整性约束,每种类型完整性约束至少要设计一个,描述清楚完整性约束要求,设计和运行触发完整性约束检查的数据更新语句,并截图相应的实验结果,每幅截图并要有较为详细的描述。
SQL的完整性约束
SQL的完整性约束 完整性约束的作⽤就是改变相应变量的值域,以满⾜⾃⼰的要求。
完整性约束主要包括三个部分:单⼀关系上的约束(即⼀个表的约束),参照完整性(即表与表之间的约束)和断⾔。
(1)单⼀关系上的约束 单⼀关系上的完整性约束主要包括: ·not null 变量取值不能为空 ·unique 独特的,限定属性不可以出现重复,形式为unique<A1,A2,...,An> ·check<谓语> check⼦句可以⽤于关系声明和域声明。
⽤于关系说明时,check⼦句指定的关系中的所有元组都必须满⾜check的谓语 令,check常可以与in搭配表⽰枚举。
注:check⼦句在MySQL中依然可以使⽤,但是没有意义,因为MySQL会⾃动忽略check的⼦句。
在MySQL中代替check功能的⽅式有两种:第⼀种是使⽤enum进⾏枚举,见下例2;第⼆种是使⽤触发器(trigger)的⽅法来实现,见下例3.CREATE TABLE student(id int not null,student_name varchar(20),age int,degree char(15),PRIMARY KEY(id),CHECK(degree in ('Bachelors','Masters','Doctorate')),CHECK(age >18AND age <40)); 执⾏创建的关系:例2 创建⼀个学位为枚举类型的关系CREATE TABLE student (student_id INT,student_name VARCHAR(20),student_birthday DATE,student_degree ENUM('Masters','Bachelors','Doctorate'),PRIMARY KEY(student_id)); 创建的关系 插⼊⼀个在枚举范围内和⼀个不在枚举范围内的值时:INSERT INTO studentVALUES(1, 'Jisoo', '1995-01-03', 'Masters');INSERT INTO studentVALUES(2, 'Lisa', '1997-03-27', 'Senior'); 插⼊的结果为:例3 创建关系和触发器 依旧令student_degree在三个枚举范围内,否则默认设置为‘Bachelors’CREATE TABLE student (student_id INT,student_name VARCHAR(20),student_birthday DATE,student_degree VARCHAR(15),PRIMARY KEY(student_id));CREATE TRIGGER student_degree_trigger BEFORE INSERT ON student FOR EACH ROWBEGINIF new.student_degree NOT IN ('Masters','Bachelors','Doctorate')THEN SET new.student_degree ='Bachelors';END IF;END 插⼊⼀个在枚举范围内和⼀个不在枚举范围内的值时:INSERT INTO studentVALUES(1, 'Jisoo', '1995-01-03', 'Masters');INSERT INTO studentVALUES(2, 'Lisa', '1997-03-27', 'Senior'); 插⼊的结果为(2)参照完整性 参照完整性的解释时⼀个关系中的属性的取值可能在别的关系中也出现,这就是参照完整性,⼜称为外码。
数据完整性约束
数据完整性
唯一约束的命名规则为UQ_字段名 默认值约束是指在表记录添加后用户没有输入某个字段值时,该字段 值是由系统自动提供。
11
5
数据完整性
约束包括六种: 主键约束(PRIMARY KEY) 检查约束(CHECK) 外键约束(FOREIGN KEY) 非空约束(NOT NULL) 唯一约束(UNIQUE) 默认值约束(DEFAULT)
6
数据完整性
主键约束用于满足实体完整性,要求主键列数据唯一,并且不允许为 空,主键 约束的命名推荐使用“PK_表名”的命名格式,方便后续使用时 进行识别。 外键约束用于实现表和表之间的参照完整性,外键约束的核心是 给表创建外 键。外键的作用是关联两张二维表,使二维表所描述的实 体建立联系。 外键可以理解为两张二维表含义上的公共字段,这个字段的字段 名在两张表 中可以不同,但是要注意,公共字段在两张表中的数据类 型一定是相同的。
数据完整性约束-数据库
数据完整性
实体完整性
域完整性
数据完整性
参照完整性
用户自定义完整性
2
数据完整性
实体完整性: 实体完整性要求如果属性A是关系R的主属性,则属性A不能取空值。 实体完整性 用于保证关系数据库表中的每条记录都是唯一的,建立主键的 目的就是为了实现 实体完整性。
域完整性: 用来保证数据的有效性,它可以限制录入的数据与数据类型是否一致, 规定字段 的默认值,设置字段是否可以为空,域完整性可以确保不会输入 无效的数据。
9
数据完整性
唯一约束应用于表中的非主键列,用于指定一个或者多个字段的组 合的值具有唯一 性,以防止在字段中输入重复的值。
唯一约束与主键约束的区别: 一张表可以设置多个唯一约束,但是主键约束在一个表中只能有一 个,因为它是表 中字段的唯一标识。 设置了唯一约束的列值必须唯一,但允许有一个空值NULL。而设 置了主键约束的 列值必须唯一,而且不允许为空。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
2.利用T-SQL语句定义(删除)唯一性约束 (1)在创建表时创建唯一性约束 其语法格式如下。
语法格式1:(只有一个字段作为唯一约束) CREATE TABLE 数据表名 (列名 数据类型 CONSTRAINT 约束名 UNIQUE ) 【例5.3】创建和kc表结构相同的kc_new表,设置课程 名为唯一约束,约束名为ix_kcm1。
语法格式2:(有多个字段结合作为唯一约束,主键也类似) CREATE TABLE 数据表名
( …… CONSTRAINT 约束名 UNIQUE (列名1[,…n]) )
例:创建和cj表结构相同的cj_new表,设置学号和课程 号为唯一约束,约束名为IX_xhkch。
create table cj_new
1.利用Management Studio定义(删除)唯一性约束
步骤1:右键要建立唯一约束的表选择“修改” 。 步骤2:右击要设置唯一约束的字段(列)选择“索引/键”。 步骤3:在弹出的窗口中点击“添加”,在右边窗口的“名称” 处输入约束名,在类型中选择“唯一键”,点击“列”的浏览按钮 选中要设置为唯一约束的字段(如出生日期)。 步骤4:点击“关闭”按钮,保存即可。
字段名 部门编号 部门名称 电话号码
数据类型 char(5) varchar(10) char(13)
允许空 否,主键 否 是
CREATE TABLE bm
(5-1)
(
部门编号 CHAR(5) NOT NULL CONSTRAINT pk_bh
PRIMARY KEY,
部门名称 VARCHAR(10) NOT NULL,
第5章 数据完整性
5.1 数据完整性的基本概念
数据完整性包括实体完整性、域完整性、参照完整性和 用户定义的完整性。
1.实体完整性(Entity Integrity) 实体完整性用于保证数据库中数据表的每一个特定实体 都是唯一的。它可以通过主键约束(PRIMARY KEY)、唯 一键约束(UNIQUE)、索引或标识属性(IDENTITY)来 实现。 2.域完整性(Domain Integrity) 域完整性就是保证数据库中的数据取值的合理性,即保 证指定列的数据具有正确的数据类型、格式和有效的数据范 围。通过为表的列定义数据类型以及检查约束(CHECK)、 默认定义(DEFAULT)、非空(NOT NULL)和规则实现 限制数据范围,保证只有在有效范围内的值才能存储到列中。
5.2.2 唯一键(UNIQUE)约束
可使用UNIQUE约束确保在非主键列中不输入重复值。 在允许空值的列上保证唯一性时,应使用UNIQUE约束而不 是PRIMARY KEY约束,不过在该列中只允许有一个NULL 值。一个表可以定义多个UNIQUE约束,但只能定义一个 PRIMARY KEY约束。
1.利用Management Studio定义(删除)主键
2.利用T-SQL语句定义(删除)主键 (1)在创建表时创建主键约束
其语法格式如下 CREATE TABLE 数据表名 (列名 数据类型 [CONSTRAINT 约束名] PRIMARY KEY)
例:用命令方式新建如下所示的bm表,设置主键名为pk_bh。
4.用户定义的完整性(User-defined Integrity) 这是由用户定义的完整性。用户可以根据自己的业务规 则定义不属于任何完整性分类的完整性。
5.2 约束
约束是通过限制列中数据、行中数据以及表之间数据取 值从而保证数据完整性的非常有效和简便的方法。
5.2.1 主键(PRIMARY KEY)约束 PRIMARY KEY约束在表中定义一个主键,唯一的标 识表中的行。一个表只能有一个PRIMARY KEY约束。 当向表中的现有列添加PRIMARY KEY约束时,SQL Server将检查列中现有的数据以确保现有数据遵从主键的 规则,即无空值、无重复值。 每个表都应有一个主键。主键可以是一列或列组合。
电话号码 CHAR(13)
)
(2)向已有表中添加主键约束 其语法格式如下。
ALTER TABLE 表名 ADD [CONSTRAINT 约束名] PRIMARY KEY(列名1[,…n]))
例:先用图形方式删除cj表中的主键,然后用命令方式添 加主键为学号和课程号,主键名为pk_xhkch。
ALTER TABLE cj
CREATE TABLE kc_new
(5-4)
(课程号 CHAR(4) NOT NULL CONSTRAINT pk_kch1 PRIMARY KEY,
课程名 CHAR(16) NOT NULL CONSTRAINT ix_kcm1 UNIQUE,
学分 SMALLINT,
学时数 SMALLINT)
(5-5)
(
学号char(10) not null ,
课程号char(4) not null,
成绩numeric(5,2)
CONSTRAINT IX_xhkch UNIQUE (学号,课程号)
)
(2)向已有表中添加唯一约束,其语法格式如下。 ALTER TABLE 表名 ADD CONSTRAINT 约束名 UNIQUE (列名1[,…n]))
3.参照完整性(Referential Integrity) 参照完整性定义了一个关系数据库中,不同的表中列之 间的关系(父键与外键)。要求一个表中(参照表)的一列 或列组合的值必须与另一个表(被参照表)中的相关一列或 列组合的值相匹配。被引用的列或列组合称为父键,父键必 须是主键或唯一键,通常父键为主键,主键表(被参照表) 是主表。引用父键的一列或列组合称为外键,外键表(参照 表)是子表。子表的外键必须与主表的主键相匹配,只要依 赖某一主键的外键存在,主表中包含该主键的行就不能被删 除。
(5-2)
ADD CONSTRAINT pk_xhkch PRIMARY KEY(学号,课程号)
(3)删除主键约束 其语法格式如下: ALTER TABLE 表名 DROP CONSTRAINT 约束名 cj
(5-3)
DROP CONSTRAINT pk_xhkch