【SQL】约束与触发器2
3.修改约束
3.1给约束命名
按如下格式命名:
name CHAR(30) CONSTRAINT NameIsKey PRIMARY KEY
gender CHAR(1) CONSTRAINT NoAndro
CHECK (gender IN ('F','M'))
CONSTRAINT RightTitle
CHECK (gender = 'F' or name NOT LIKE 'Ms.%')
3.2 修改表上的约束
①修改约束的检查时间
SET CONSTRAINT MyConstraint DEFERRED;
SET CONSTRAINT MyConstraint IMMEDIATE;
②用ALTER TABLE语句
删除约束 DROP
ALTER TABLE MovieStar DROP CONSTRAINT NameIsKey;
ALTER TABLE MovieStar DROP CONSTRAINT NoAndro;
ALTER TABLE MovieStar DROP CONSTRAINT RightTitle;
添加约束 ADD(注意,约束必须是要整个表遵守时才加)
ALTER TABLE MovieStar ADD CONSTRAINT NameIsKey
PRIMARY KEY(name);
ALTER TABLE MovieStar ADD CONSTRAINT NoAndro
CHECK (gender IN ('F','M'));
ALTER TABLE MovieStar ADD CONSTRAINT RightTitle
CHECK (gender = 'F' OR name NOT LIKE 'Ms.%');
注意:SQL不会记住已经删除的约束,所以如果要添加之前删除的约束必须重新写一遍。
四、断言
1.创建断言
CREATE ASSERTION 断言名 CHECK (条件)
2.使用断言
CREATE ASSERTION RichPres CHECK
(NOT EXISTS
(SELECT Studio.name
FROM Studio, MovieExec
WHERE presC# = cert# AND netWorth < 1000000
)
);
上面的断言不允许资金小于1000000的经理。
CREATE ASSERTION SumLength CHECK (10000 >= ALL
(SELECT SUM(length) FROM Movies GROUP BY studioName)
);
上面的断言不允许电影公司的电影总长度超过10000分钟。
如果这个语句用CHECK约束写,是
CHECK ( 10000 >= ALL
(SELECT SUM(length) FROM Movies GROUP BY studioName));
断言和CHECK的区别:
CHECK只在插入和修改时有效,但对删除不做检查,在有些情况下会导致约束不成立。
断言则在任何提及的关系改变时都会检查,确保条件成立。
3.删除断言
DROP ASSERTION 断言名
五、触发器
当特定事件发生时,触发器被激活。如果状态满足触发器中的条件,则该触发器相连的动作被执行。
例子:
1.不允许降低电影制作人的净资产
CREATE TRIGGER NetWorthTrigger
AFTER UPDATE OF netWorth ON MovieExec
REFERENCING
OLD ROW AS OldTuple,
NEW ROW AS NewTuple
FOR EACH ROW
WHEN (OldTuple.netWorth > NewTuple.netWorth)
UPDATE MovieExec
SET netWorth = OldTuple.netWorth
WHERE cert# = NewTuple.cert#;
2.阻止电影制作人的平均资产降到500000.要对插入、删除、修改分别设置触发器。这里列出修改的:
CREATE TRIGGER AvgNetWorthTrigger
AFTER UPDATE OF netWorth ON MovieExec
REFERENCING
OLD TABLE AS OldStuff,
NEW TABLE AS NewStuff
FOR EACH STATEMENT
WHEN (500000 > (SELECT AVG(netWorth) FROM MovieExec))
BEGIN
DELETE FROM MovieExec
WHERE (name, address, cert#, netWorth) IN NewStuff;
INSERT INTO MovieExec
(SELECT * FROM OldStuff);
END;
3.以year为主键的一部分,防止主键为空。在插入前如果发现year为空则插入默认值1915
CREATE TRIGGER FixYearTrigger
BEFORE INSERT ON Movies
REFERENCING
NEW ROW AS NewRow
NEW TABLE AS NewStuff
FOR EACH ROW
WHEN NewRow.year IS NULL
UPDATE NewStuff SET year = 1915;
相关选项介绍:
AFTER/BEFORE:决定测试是在事件发生前还是发生后
可被触发的事件:UPDATE\INSERT\DELETE
OF 属性:UPDATE的可选项,如果选中,则只有列出的属性变化时才激活触发器。
WHEN语句:可选项,如果选择,则条件为真才执行后面的语句,否则一定执行后面的语句。
多个执行动作:用BEGIN, END括起来
OLD ROW AS/NEW ROW AS/OLD TABLE AS/NEW TABLE AS:引用表修改前后的元组和表
FOR EACH ROW/FOR EACH STATEMENT:行级触发器,语句级触发器。如果更新整个表,行级触发器要对修改的元组一次一个的执行;语句级触发器则只用执行一次。语句级触发器不能引用新旧元组,但可以引用新旧表;行级触发器则都可以引用。
插入元组则没有旧值,删除元组则没有新值
【SQL】约束与触发器2的更多相关文章
- 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 ...
随机推荐
- Python之tornado框架原理
Python web框架 1.简单概念 tornado socket.逻辑处理 Django flask 逻辑处理 第三方处理模块(包含了socket) jinja2模块 Models 数据库处理 V ...
- RMQ问题+ST算法
一.相关定义 RMQ问题 求给定区间的最值: 一般题目给定许多询问区间. 常见问题:对于长度为n的数列A,回答若干询问RMQ(A,i,j)(i,j<=n),返回数列A中下标在i,j之间的最小/大 ...
- 【历史】- Unix时代的开创者Ken Thompson
自图灵奖诞生以来,其获得者一直都是计算机领域的科学家与学者,而在所有这些界的图灵奖中只有唯一的一届有个例外,那就是Ken Thompson与Dennis M. Ritchie,他们都是计算机软件工程师 ...
- Leader Election
Leader Election Zookeeper的基本操作 Zookeeper虽然是分布式系统,但它并不是为文件存储而设计的,Zookeeper里存储的一般是配置信息和源信息.实际上,Zookeep ...
- 《深入浅出 Java Concurrency》—并发容器 ConcurrentMap
(转自:http://blog.csdn.net/fg2006/article/details/6404226) 在JDK 1.4以下只有Vector和Hashtable是线程安全的集合(也称并发容器 ...
- 【Python】Python—判断变量的基本类型
type() >>> type(123)==type(456) True >>> type(123)==int True >>> type('ab ...
- WebSocket API使用篇检测浏览器是否支持WebSocket(4)
WebSocket API是下一代客户端-服务器的异步通信方法.前面有三篇文章已经对WebSocket有了一些介绍,这里我总结了一下.我在使用WebSockets API过程中遇到的问题. 1.检测浏 ...
- [NOIP2017]列队 线段树
---题面--- 题解: 之前写的splay,,,然而一直没调出来,我感觉是某个细节想错了,,然而已经重构4次代码不想再写splay了.于是今天尝试了线段树的解法. 首先因为每次出列之后的变化都是将当 ...
- 【Cf edu 30 B. Balanced Substring】
time limit per test 1 second memory limit per test 256 megabytes input standard input output standar ...
- java AWT repaint paint update 方法
paint(Graphic g): awt调用这个方法有2种形式.程序驱动方式和系统驱动方式. 在系统驱动的情况下(比如界面第一次显示组件),系统会判断组件的显示区域,然后向事件分发线程发出调用pai ...