【SQL】约束与触发器1
一.外键
1.1特点
表A的外键,一定是其他某个表B的主键或有UNIQUE声明的属性。
A的外键的值,一定是对应表B中相应的属性值。(空值除外)
1.2声明方法
方法1:属性名 类型 REFERENCES 表名 (属性名)
方法2:FOREIGN KEY (属性名) REFERENCE 表名 (属性名)
CREATE TABLE Studio(
name CHAR(30) PRIMARY KEY,
address VARCHAR(255),
persC# INT REFERENCES MovieExec(cert#)
);
CREATE TABLE Studio(
name CHAR(30) PRIMARY KEY,
address VARCHAR(255),
presC# INT,
FOREIGN KEY (persC#) REFERENCES MovieExec(cert#)
);
1.3 引用完整性
设表A的外键,是表B的主键或UNIQUE。则,下面的四种情况出错:
1.A中插入的新元组(非空值),其外键不是B中的值
2.A中修改的新元组(非空值),其外键不是B中的值
3.删除B中的元组,其主键非空,且是A的外键
4.修改B中的元组的主键,且是A的外键
其中1,2一定不能违反。3,4可以有3种处理方法:
1.缺省原则:拒绝违反更新。
2.级联原则:如果把B中的主键删除,则删除对应A中的元组;如果修改B中的主键,也修改A中相应的外键
3.置空值原则:如果对B的主键的修改,影响到了A中的外键,则把A中的相应外键置空。
声明方法:
ON DELETE或ON UPDATE后面加上SET NULL或CASCADE
CREATE TABLE Studio(
name CHAR(30) PRIMARY KEY,
address VARCHAR(255),
presC# INT REFERENCES MovieExec(cert#)
ON DELETE SET NULL
ON UPDATE CASCADE
);
上面语句表示,删除时采用置空值原则,更新时采用级联原则。
1.4延迟约束检查
如果有循环约束,比如表A{属性a unique}, B{属性b unique}。a是外键,引用b;且b是外键,引用a。则这是一个循环约束。不管以怎样的顺序插入都会违反外键约束。解决方法:
1.将两个插入动作组成一个事务
2.通知DBMS不用检查其约束,直到整个事务完成执行并要提交为止。
为做到第2点,可以使用如下语句:
约束后面加: DEFERRABLE(延迟)或NOT DEFERRABLE(非延迟 默认)
DEFERRBLE后面可以有INITIALLY DEFERRED(检查推迟到事务提交前执行),INITIALLY IMMEDIATE(立即执行检查 ??跟NOT DEFERRABLE区别??)
如果约束有名字,如MyConstraint可以用
SET CONSTRAINT MyConstraint DEFERRED; 设为延迟检查
SET CONSTRAINT MyConstraint IMMEDIATE; 设为立即检查
CREATE TABLE Studio(
name CHAR(30) PRIMARY KEY,
address VARCHAR(255),
persC# INT UNIQUE
REFERENCES MovieExec(cert#)
DEFERRABLE INITIALLY DEFERRED
);
二、属性和元组上的约束
2.1 属性上的约束
①非空值约束:不允许该属性为空值。方法:在CREATE TABLE的属性声明后面用NOT NULL
persC# INT REFERENCES MovieExec(cert#) NOT NULL
注意:会导致外键约束中的置空原则不可用。
②基于属性的CHECK约束
presC# INT REFERENCES MovieExec(cert#)
CHECK (presC# >= 100000)
上述语句保证presC#至少有6位
gender CHAR(1) CHECK (gender IN ('F', 'M'))
上述语句保证gender只能取‘F’,‘M’两种情况。
presC# INT CHECK
(presC# IN (SELECT cert# FROM MovieExec))
上述语句跟前面的外键约束很像,但是有不同。
不同点:1.该语句使得presC#不能为空,而外键约束可以(置空值原则) 2.该检查只在插入时起作用,但是后面对presC#修改导致违反该约束时,该约束无法检查出来。(这样的效率高,如果要严谨则不要这么写)
2.2基于元组的CHECK约束
涉及元组的多个属性的约束,要用基于元组的约束。
例,禁止把一个男性Male的名称以Ms.开头。
则CHECK中的应该是 非(Male && Ms.) = 非(Male) or 非(Ms.)
CREATE TABLE MovieStar(
name CHAR(30) PRIMARY KEY,
address VARCHAR(255),
gender CHAR(1),
birthdate DATE,
CHECK (gender = 'F' OR name NOT LIKE 'Ms.%')
);
与基于属性的CHECK约束相比,基于元组的CHECK约束检查的更频繁,只要该元组的任一个属性被改变,都要检查。而基于属性的CHECK约束只有在相应的属性变化时才检查。
【SQL】约束与触发器1的更多相关文章
- SQL中约束和触发器的停用与启用
如何对SQL中的约束和触发器进行停用与启用,如果有外键约束则相关联表都要进行相应操作. ALTER TABLE TableName CHECK CONSTRAIT ALL --检查约束 ALTER T ...
- SQL数据库—<8>触发器
触发器:一.什么是触发器? 一段SQL代码,挂到某个表的某个增.删.改的操作上. 当这个表执行相应的操作时,就会触发这段相应的SQL代码.触发器与存储过程的区别:1.存储过程是独立于表存在 ...
- SQL CREATE TABLE 语句\SQL 约束 (Constraints)\SQL NOT NULL 约束\SQL UNIQUE 约束
CREATE TABLE 语句 CREATE TABLE 语句用于创建数据库中的表. SQL CREATE TABLE 语法 CREATE TABLE 表名称 ( 列名称1 数据类型, 列名称2 数据 ...
- SQL约束
SQL约束: 非空约束:就是不能为null: 主键约束(PK):唯一,不重复,并且不为空: 唯一约束:唯一,允许为空,但只能出现一次: 默认约束:如果不给值,默认值: 检查约束:范围以及格式限制: 外 ...
- Mysql笔记【3】-SQL约束
SQL 约束 约束用于限制加入表的数据的类型. 可以在创建表时规定约束(通过 CREATE TABLE 语句),或者在表创建之后也可以(通过 ALTER TABLE 语句). 我们将主要探讨以下几种约 ...
- SQL 约束解说
SQL 约束解说 2009-04-27 09:29 约束主要包含: NOT NULL UNIQUE PRIMARY KEY FOREIGN KEY CHECK DEFAULT 1.not null : ...
- SQL 约束 (Constraints)
SQL 约束 约束用于限制加入表的数据的类型. 可以在创建表时规定约束(通过 CREATE TABLE 语句),或者在表创建之后也可以(通过 ALTER TABLE 语句). 我们将主要探讨以下几种约 ...
- SQL 约束(Constraints)
SQL 约束(Constraints) SQL 约束(Constraints) SQL 约束用于规定表中的数据规则. 如果存在违反约束的数据行为,行为会被约束终止. 约束可以在创建表时规定(通过 CR ...
- SQL-W3School-高级:SQL 约束(Contraints)
ylbtech-SQL-W3School-高级:SQL 约束(Contraints) 1.返回顶部 1. SQL 约束 约束用于限制加入表的数据的类型. 可以在创建表时规定约束(通过 CREATE T ...
- Bugku-CTF之login1(SKCTF) [SQL约束攻击]
Day26 login1(SKCTF) http://123.206.31.85:49163/flag格式:SKCTF{xxxxxxxxxxxxxxxxx}hint:SQL约束攻击 本题要点:SQL ...
随机推荐
- 官方文档:11G新特性SQL PLAN BASLINE 执行计划基线
什么是SQL执行计划管理? SQL计划管理(SQL plan management)是一咱预防机制,记录和评估SQL语句的执行计划.SQL plan management的主要功能是sql plan ...
- restFul介绍及其使用规范
什么是REST和RESTful API? REST:(英文:Representational State Transfer,简称REST)表征性状态转移,是一种软件架构风格. RESTful : RE ...
- Week7 Teamework from Z.XML-NABC
NABC 引言:我们团队计划做一个手机端的类RPG2d游戏.之所以我们定义为类RPG,是因为我们希望弱化RPG在游戏中的概念--减少或者排除人物对话等较为无趣的内容,而将重点放在玩家的娱乐享受中.为了 ...
- 软工实践Beta冲刺(6/7)
队名:起床一起肝活队 组长博客:博客链接 作业博客:班级博客本次作业的链接 组员情况 组员1(队长):白晨曦 过去两天完成了哪些任务 描述: 1.界面的修改与完善 展示GitHub当日代码/文档签入记 ...
- 【转】给大家分享一下目前mlc颗粒的内存卡资料
以下信息是LZ从其它论坛上找到的TF卡也是有讲究的,一分价钱一分货 dboy99 楼主 骚(6) #1楼 2015-8-5 14:49引用Micro SD卡也叫TF卡,作为手机扩展存储空间的唯一方式用 ...
- Jboss提示:Server already running on localhost
最近在做项目中,经常遇到JBoss报如下提示:Server already running on localhost.这时Jboss显示已启动,但页面显示不出来.提示中给出了两种解决办法,运行新的服务 ...
- Flink之状态之checkpointing
1.前言 在Flink中,函数和操作符都可以是有状态的.在处理每个消息或者元素时,有状态的函数都会储存信息,使得状态成为精密操作中关键的组成部分. 为了使状态能够容错,Flink会checkpoint ...
- 通过数据库评估存储设备IO性能-Oracle11gIO校准功能介绍
通过数据库评估存储设备IO性能 ---------Oracle11g IO校准功能介绍 前言 I/O子系统是ORACLE数据库的一个重要组成部分,因为I/O操作是贯穿数据库管理全过程,它操作的对象包括 ...
- C#中的SubString()的用法
先看语法: String.SubString(int index,int length) index:开始位置,从0开始 length:你要取的子字符串的长度 例子: using ...
- [洛谷P3935]Calculating
题目大意:设把$x$分解质因数的结果为$x=p_1^{k_1}p_2^{k_2}\cdots p_n^{k_n}$,令$f(x)=(k_1+1)(k_2+1)\cdots (k_n+1)$,求$\su ...