约束

主动(active)元素是一个表达式或语句,只需编写一次,存储在数据库中,然后在适当的时间被执行。
关系之间的约束称为“断言”


外键约束声明

SQL可将关系的一个属性或属性组声明为外键,该外键引用另一个关系(也可以是同一个关系)的属性(组)
注意:被引用的另一个关系的属性在它所在的关系中,必须被声明为unique或pk

两种方式
presC# int references movieExec(cert#)

foreign key (presC#) references movieExec(cer#)
也可以是属性名列表

注意:presC#可以有NULL,这并不要求cert#中也要有null


维护引用完整性

DBMS会阻止在声明了外键约束的关系上的违法修改
但对于在被引用关系上的违法修改,设计者可在下面上个选项中进行选择
1.缺省原则(default):拒绝违法更新
2.级联原则(cascade):被引用属性(组)的改变被仿造到外键上(A引用B,B删A删,B改A改)
3.置空值原则(set null):当在被引用的关系上的更新影响外键值时,后者被改为空值
这些选择可独立地选择删除和修改,同外键一起声明

//presC#是关系studio中的属性
presC# int references movieExec(cert#)
                on delete set null
                on update cascade
//删除时置空,修改时级联

补充:违反引用完整性的元组称为悬浮元组(外键连接运算时连不上)


延迟约束检查

若要往studio中插入一个具有一个新的presC#的元组的话,必须要先去movieExec中插入具有对应的cert#的元组
但当循环约束发生时,先插入哪个都不行
要将两个插入操作组成一个单一的事务,并通知DBMS不要检查其约束,直到整个事务完成执行并要提交为止
任何约束的声明后面都可以跟上
1.deferrable:约束检查将推迟到当前事务完成是进行
2.not deferrable:缺省值,每执行一条可能违反外键约束的更新操作,都会进行检查
deferrable的后面可以更上:
1.initially deferred:检查仅被推迟到事务提交前执行
2.initially immediate:检查在每个语句后立刻被执行


DEFERRABLE INITIALLY IMMEDIATE
默认检查在每个语句后立即被执行。但在需要的时候,可以随时将约束检查延后。
在这种情况下该选项非常有用:多数时候需要在每个语句后立即检查约束,但偶尔有一批工作需要将约束检查延后。
NOT DEFERRABLE
永远无法将约束检查延后至事务提交时


presC# int unique
          references movieExec(cert#)
          deferrable initially deferred

set constraint myConstraint deferred
set constraint myConstraint immediate


SQL的create table语句可声明两种约束:1.在单一属性上的约束2.在整个元组上的约束


非空值约束

presC# int references movieExec(cert#) not null
这时候置空值原则就不能用了


基于属性的check约束

若数据库的修改没有改变与约束相关的属性,则不进行基于属性的check约束检查
presC# int references movieExec(cert#) check(presC#>=100000)
gender char(1) check(gender in('F','M'))
用check约束来模拟引用完整性约束是不行的
presC# int check (presC# in (select cert# from movieExec))
注意presC#不能被赋空值,这点和外键约束有点不一样
若改变movieExec关系,该变化对check不可见,违反check约束也会被执行


基于元组的check约束

check (gender='F' or name not like 'Ms.%')
类似与基于属性的check约束,基于元组的check约束对于其它关系不可见(若条件在子查询中提及其它关系,那个关系的改变会使得R中某些元组为假,check无法阻止这种改变)
若基于元组的检查没有子查询,那这类约束总可以保持
基于元组的约束比基于属性的更频繁的被检查,只要该元组的任何一个属性被改变,而不是仅当约束中被提及属性改变


给约束命名

name char(30) constraint nameIsKey primary key


修改约束

1.通过set constraint修改约束是否延期检查
set constraint myConstraint deferred
set constraint myConstraint immediate
2.通过alter table
alter table movieStar drop constraint nameIsKey
已删除的约束,就不可以再引用它的名字了

alter table movieStar add constraint nameIsKey
                 primary key(name)

加的是基于元组的约束


SQL中主动元素的最强有力的形式与特定的元组或元组的分量并不相关
这些元素被称为触发器和断言,它们是数据库模式的一部分,等同于表
DBMS必须推断数据库的任何更新是否影响断言的真假


创建断言

create assertion 断言名 check (条件)
当断言建立时,断言的条件必须是真,且永远保持是真

create assertion richPres check
              (not exists
                     (select studio.name
                       from studio,movieExec
                       where presC#=cert# and netWorth<10000000
                     )
               )

删除断言

drop assertion 断言名


check约束发生在对关系插入元组或属性修改时,并且若有子查询的话就不能确保成立(检查的是一条元组)
断言发生在对任何提及的关系做改变时,必须以某种方式聚集条件的结果(检查的是整个关系)

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 219,869评论 6 508
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,716评论 3 396
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 166,223评论 0 357
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 59,047评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,089评论 6 395
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,839评论 1 308
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,516评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,410评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,920评论 1 319
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,052评论 3 340
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,179评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,868评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,522评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,070评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,186评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,487评论 3 375
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,162评论 2 356

推荐阅读更多精彩内容

  • 约束 一、非空约束(not null) 1.1、在创建表时设置非空约束 语法:create table 表名(字段...
    lingoling阅读 746评论 0 0
  • 约束用于限制加入表数据的类型,目的是保证数据的一致性和完整性 创建格式:在创建表时规定约束(在Create添加),...
    产品小正阅读 993评论 0 1
  • SQL的主键和外键的作用: 外键取值规则:空值或参照的主键值。 (1)插入非空值时,如果主键表中没有这个值,则不能...
    itrojan阅读 1,328评论 0 52
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,673评论 18 139
  • 1、约束概述 约束的目的是为了保证数据的完整性与一致性。 按照约束的范围划分:列级约束:只对一个数据列建立约束。既...
    黒猫阅读 984评论 3 5