【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:行级触发器,语句级触发器。如果更新整个表,行级触发器要对修改的元组一次一个的执行;语句级触发器则只用执行一次。语句级触发器不能引用新旧元组,但可以引用新旧表;行级触发器则都可以引用。

插入元组则没有旧值,删除元组则没有新值

时间: 2024-12-24 12:20:47

【SQL】约束与触发器2的相关文章

SQL 约束,事务,触发器,存储引擎,多表查询

SQL约束 SQL约束主要有以下几种: NOT NULL: 用于控制字段的内容一定不能为空(NULL). UNIQUE: 控件字段内容不能重复,一个表允许有多个 Unique 约束. PRIMARY KEY:也是用于控件字段内容不能重复,但它在一个表只允许出现一个. FOREIGN KEY: FOREIGN KEY 约束用于预防破坏表之间连接的动作,FOREIGN KEY 约束也能防止非法数据插入外键列,因为它必须是它指向的那个表中的值之一. CHECK: 用于控制字段的值范围. DEFAULT

SQL Server DDL 触发器(Trigger)-- 创建数据库级别的DDL触发器

SQL Server DDL 触发器(Trigger)-- 创建数据库级别的DDL触发器 以下针对某个数据库在创建数据表时调用触发器,并将创建该数据表的用户账户写入到Windows的Event Log中. CREATE TRIGGER reminder ON DATABASE FOR CREATE_TABLE AS DECLARE @str NVARCHAR(100) SET @str=suser_sname() + N'create a new table' RAISERROR(@str,10

SQL Server:触发器详解

SQL Server:触发器详解 1. 概述 2. 触发器的分类 3. Inserted和Deleted表 4. 触发器的执行过程 5. 创建触发器 6. 修改触发器: 7. 删除触发器: 8. 查看数据库中已有触发器: 9. “Instead of”相关示例: 10. “After”触发器 11. 参考资源 1. 概述 触发器是一种特殊的存储过程,它不能被显式地调用,而是在往表中插入记录﹑更新记录或者删除记录时被自动地激活. 所以触发器可以用来实现对表实施复杂的完整性约束. 2. 触发器的分类

SQL中的触发器

触发器 (一)理解: 是一种特殊的存储过程,它不能显式地调用,而是进行insert.delete.update时被自动低激活.总结一句话就是:用来实现对标实施完整性约束的. SQL Server为每个触发器都创建了两个表:inserted和deleted表.它们是系统维护的,它们存在在内存中,不是在数据库中,这连个标的结构总是与被该触发器作用的标的结构相同.触发器执行与该触发器相连的这两个表也被删除. (二)类型: Instead of 和After触发器 instead of 触发器用于替代(

sql 高级 (四)(SQL 约束 (Constraints))

SQL 约束 NOT NULL UNIQUE PRIMARY KEY FOREIGN KEY CHECK DEFAULT UNIQUE 和 PRIMARY KEY 约束均为列或列集合提供了唯一性的保证. 区别:每个表可以有多个 UNIQUE 约束,但是每个表只能有一个 PRIMARY KEY 约束. unique  sql  ?unique ?  Constraint   on   create   table(表未被创建) MySql   CREATE TABLE Persons ( Id_P

SQL 约束解说

2009-04-27 09:29 约束主要包含: NOT NULL UNIQUE PRIMARY KEY FOREIGN KEY CHECK DEFAULT 1.not null :用于控制字段的内容一定不能为空(NULL).     使用方法 :Create table MyTable               (                   id varchar(32) not null,                   name varchar (32)           

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

CREATE TABLE 语句 CREATE TABLE 语句用于创建数据库中的表. SQL CREATE TABLE 语法 CREATE TABLE 表名称 ( 列名称1 数据类型, 列名称2 数据类型, 列名称3 数据类型, .... ) 数据类型(data_type)规定了列可容纳何种数据类型.下面的表格包含了SQL中最常用的数据类型: 数据类型 描述 integer(size) int(size) smallint(size) tinyint(size) 仅容纳整数.在括号内规定数字的最

SQL Server DDL 触发器(Trigger)-- 创建服务器级别的DDL触发器

SQL Server DDL 触发器(Trigger)-- 创建服务器级别的DDL触发器 若是创建服务器级别的DDL触发器,只要把先前的ON DATABASE改为ON ALL SERVER,即可跟踪服务器级别的事件,使用的原理与数据库级别的DDL触发器相似,区别只在跟踪的事件不同. CREATE TRIGGER ddl_trig_login ON ALL SERVER FOR DDL_LOGIN_EVENTS AS PRINT n'ALTER LOGIN EVENT' SELECT EVENTD

SQL Server DDL 触发器(Trigger)-- 介绍

SQL Server DDL 触发器(Trigger)-- 介绍 触发器(Trigger)以往仅用在特定的对象上,如数据表.当数据维护语言(DML)的Insert.Delete.Update语法针对这些对象工作时,由系统自动调用对应的触发器,而在SQL Server 2000中增加了Instead of Trigger,通过触发器来取代原本要执行的添加.修改.删除语法,且可以设置在视图上.由于Instead of Trigger是在DML语法真的改变数据写入事务日志之前触发,因此,也称为Befo

创建与删除SQL约束或字段约束

1)禁止所有表约束的SQLselect 'alter table '+name+' nocheck constraint all' from sysobjects where type='U'2)删除所有表数据的SQLselect 'TRUNCATE TABLE '+name from sysobjects where type='U'3)恢复所有表约束的SQLselect 'alter table '+name+' check constraint all' from sysobjects w