一.外键

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 DELETEON UPDATE后面加上SET NULLCASCADE

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的更多相关文章

  1. SQL中约束和触发器的停用与启用

    如何对SQL中的约束和触发器进行停用与启用,如果有外键约束则相关联表都要进行相应操作. ALTER TABLE TableName CHECK CONSTRAIT ALL --检查约束 ALTER T ...

  2. SQL数据库—<8>触发器

    触发器:一.什么是触发器?    一段SQL代码,挂到某个表的某个增.删.改的操作上.    当这个表执行相应的操作时,就会触发这段相应的SQL代码.触发器与存储过程的区别:1.存储过程是独立于表存在 ...

  3. SQL CREATE TABLE 语句\SQL 约束 (Constraints)\SQL NOT NULL 约束\SQL UNIQUE 约束

    CREATE TABLE 语句 CREATE TABLE 语句用于创建数据库中的表. SQL CREATE TABLE 语法 CREATE TABLE 表名称 ( 列名称1 数据类型, 列名称2 数据 ...

  4. SQL约束

    SQL约束: 非空约束:就是不能为null: 主键约束(PK):唯一,不重复,并且不为空: 唯一约束:唯一,允许为空,但只能出现一次: 默认约束:如果不给值,默认值: 检查约束:范围以及格式限制: 外 ...

  5. Mysql笔记【3】-SQL约束

    SQL 约束 约束用于限制加入表的数据的类型. 可以在创建表时规定约束(通过 CREATE TABLE 语句),或者在表创建之后也可以(通过 ALTER TABLE 语句). 我们将主要探讨以下几种约 ...

  6. SQL 约束解说

    SQL 约束解说 2009-04-27 09:29 约束主要包含: NOT NULL UNIQUE PRIMARY KEY FOREIGN KEY CHECK DEFAULT 1.not null : ...

  7. SQL 约束 (Constraints)

    SQL 约束 约束用于限制加入表的数据的类型. 可以在创建表时规定约束(通过 CREATE TABLE 语句),或者在表创建之后也可以(通过 ALTER TABLE 语句). 我们将主要探讨以下几种约 ...

  8. SQL 约束(Constraints)

    SQL 约束(Constraints) SQL 约束(Constraints) SQL 约束用于规定表中的数据规则. 如果存在违反约束的数据行为,行为会被约束终止. 约束可以在创建表时规定(通过 CR ...

  9. SQL-W3School-高级:SQL 约束(Contraints)

    ylbtech-SQL-W3School-高级:SQL 约束(Contraints) 1.返回顶部 1. SQL 约束 约束用于限制加入表的数据的类型. 可以在创建表时规定约束(通过 CREATE T ...

  10. Bugku-CTF之login1(SKCTF) [SQL约束攻击]

    Day26 login1(SKCTF) http://123.206.31.85:49163/flag格式:SKCTF{xxxxxxxxxxxxxxxxx}hint:SQL约束攻击  本题要点:SQL ...

随机推荐

  1. Week3 Teamework from Z.XML-团队分工及贡献分分配办法

    引言:团队项目即将开展,本文将就团队分工,以及分数分配办法进行阐述 一.团队分工 本周我们团队进行了初步的分工,结果如下: PM: 李孟 Dev:毛宇 薛亚杰 肖俊鹏 罗凡 Test:周敏轩 马辰 李 ...

  2. 用OneNote写博客的方法

    1.进入OneNote要发布博客的分区然后点击菜单栏中的文件         2.点击发送至博客         3.这时候会启动word程序弹出下面的对话框(如果你从未设置过)点击立即注册     ...

  3. application/x-www-form-urlencoded从前端到后台

    html <form id="userForm1" enctype="application/x-www-form-urlencoded" method= ...

  4. javaScript运算符学习笔记

    1.赋值运算符 javaScript运算符可以分为简单赋值和复合赋值运算.简单赋值运算是将赋值运算符(=)右边的表达式的值保存到赋值运算符左边的变量中,复合赋值运算则是混合了其他操作(算术运算操作,位 ...

  5. js阻止冒泡事件和默认事件的方法

    阻止默认事件 function stopDeFault(e){ if(e&&e.preventDefault){//非IE e.preventDefault(); }else{//IE ...

  6. [洛谷P1536]村村通

    题意:多组数据,当n为0时结束,每组数据表示有n个村子,m条路,求还需要建多少条路,使得所有的村子联通题解:用并查集求出有多少个联通块,然后求解 C++ Code: #include<cstdi ...

  7. BZOJ3132 上帝造题的七分钟 【二维树状数组】

    题目 "第一分钟,X说,要有矩阵,于是便有了一个里面写满了0的n×m矩阵. 第二分钟,L说,要能修改,于是便有了将左上角为(a,b),右下角为(c,d)的一个矩形区域内的全部数字加上一个值的 ...

  8. 【BZOJ 2324】[ZJOI2011]营救皮卡丘 费用流

    本人实行诱骗拐卖(利用自然分层与实际意义),正解拼接补充(充分利用最大流限制(不浪费任何一个走出去的机会而不是不浪费任何一个已有的流)与问题转换) #include <cstdio> #i ...

  9. ExtJS 4.1 TabPanel动态加载页面并执行脚本【转】

    ExtJS 4.1 TabPanel动态加载页面并执行脚本 按照官方示例,可以动态加载页面,可是脚本不执行,于是查SDK.google,发现scripts需要设置为true,于是设置该属性,整个代码如 ...

  10. sqrti128

    求平方根下取整,对于gcc type __uint128_t. ~45.5ns/op on i7-7700k@4.35G,即typical <200cyc/op. Together with u ...