`
xwood
  • 浏览: 102976 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

约束与触发器

阅读更多
一、键值约束
    1.主键:primary key.
    2.Unique.
    3.外键.
    4.索引.
   
    键值约束主要有以上4种,其中Unique,外键,索引都可以在关系中存在多个,但primary key只能唯一存在。
    另外,在处理外键约束的插入、删除、更新等操作时DBMS主要提供了三种方法:
    1.引用关系的删除和修改缺省原则:当仅仅当关系中产生一个或多个悬挂元组时,操作被阻止。
    2.级联原则:删除和修改所有新产生的悬挂元组。
    3.置空原则:把每个悬挂元组中的外键值设为Null。

    注:悬挂元组是指外键值在引用关系中不出现的元组。

二、属性或元组上的约束
    1.非空约束:NOT NULL
    2.基于属性的Check约束:
   
parentnum int check (parentnum >= 300000)

    3.基于元组的check约束:
   
    create table person(
       name char(10) primary key,
       age int,
       check(name is not null and age < 10)
    )

   
     操作约束的相关SQL:
     1.使约束在立即执行与延迟执行状态之间转换
    
     --设为立即执行
     setset constraints all immediate
     set constraint
     
     --设为延迟执行
     setset constraints all deferred
     set constraint
     

     2.增、删约束
    
     alert table person drop constraint const_fk;
     alert table person add constraint check(name <> 'xiao');
     


三、模式层的约束——断言与触发器
     1.断言:断言是SQL表达式,并且总是为真。
     创建断言:
    
     create assertion assertion_name check (<condtion>)
     example:
     create assertion rich check(
         not exists(
            select * 
            from studio, movieExec
            where pres = cert and netWorth < 100000
         )
     )

     删除断言:
    
drop assertion assertion_name

    
     2.触发器:事件——条件——动作规则,触发器可以在DBMS监测到指定动作执行之前或之后执行特定的操作。触发器在捕捉动作规则时有三种标准,Before和After是所有DBMS都支持的,而部分厂商同时也提供了对Instead of的支持。另外,触发器在处理影响范围时也包括行级触发(FOR EACH ROW)和语句级触发(FOR EACH STATEMENT),OLD ROW AS和NEW ROW AS 提供行级操作的新旧元组,OLD TABLE AS和NEW TABLE AS 则指代语句级操作的新旧表。WHEN语句指定的则是触发器的执行操作条件。操作由BEGIN和END语句块指定。以下是几个触发器的例子:

    
     --行级触发器
     create trigger trigger1
     after update of networth on MovieExec
     referencing 
          old row as oldtuple,
          new row as newtuple
     for each row
     when (oldtuple.networth > newtuple.networth) 
     begin
          update MovieExec
          set networth = oldtuple.networth
          where cert = newtuple.cert
     end
     
     --语句级触发器
     create trigger trigger2
     after update of networth on MovieExec
     referencing 
          old row as oldtable,
          new row as newtable
     for each statement
     when (5000 > (select avg(networth) from MoiveExec)
     begin
         delete from MovieExec
         where (name, address, cert, networth) in newtable;
         insert into MovieExec
         (select * from oldtable);
     end

     --替换触发器
     create trigger trigger3
     instead of insert on paramountMoive
     referencing new row as newrow
     for each row
     begin
          insert into moive(title, year, studioname)
          values(newrow.title, newrow.year, 'paramount')
     end
     


由于各种数据库方言而导致触发器在实际操作中略有不同,下附实例

1.ORACLE
create or replace trigger item_trigger
after insert or delete or update of other1 on t_inspect_item
for each row
begin
  if updating then
    begin
      delete from t_inspect_work_item
      where inspectitemid = :old.other1;
      insert into t_inspect_work_item(id, inspectitemid, serialnumber,serialcode, name, point)
      select a.id || :new.id as id,
             a.other1 as insepctitemid,
             a.other2 as serialnumber,
             a.serialcode as serialcode,
             a.name as name,
             a.other3 as point
      from t_inspect_item_type a
      where a.other1 = :new.other1;
    end;
   end if;

  if deleting then
    begin
      delete from t_inspect_work_item
      where inspectitemid = :old.other1 and id like '%'||:old.id;
    end;
  end if;
  
  if inserting then
    begin
      insert into t_inspect_work_item(id, inspectitemid, serialnumber,serialcode, name, point)
      select a.id || :new.id as id,
             a.other1 as insepctitemid,
             a.other2 as serialnumber,
             a.serialcode as serialcode,
             a.name as name,
             a.other3 as point
      from t_inspect_item_type a
      where a.other1 = :new.other1;
    end;
  end if;
end;
分享到:
评论

相关推荐

    SQL Server中约束与触发器差异比较.pdf

    触发器是另一种确保数据完整性的手段,但与约束不同,触发器是基于事件的。当对特定表进行INSERT、UPDATE或DELETE操作时,触发器会自动执行一段预先定义的SQL代码,以检查或更改新数据。触发器可以用来执行更复杂的...

    SQL Server中触发器与约束的应用比较.pdf

    触发器与约束在应用上各有特点和适用场景,下面将详细介绍这两者的功能、应用以及相互之间的比较。 首先,约束是SQL Server中的内建机制,它可以直接作用于表的列上,以确保数据满足特定条件。约束可以分为多种类型...

    SQL Server教学中约束和触发器的比较学习.pdf

    为了实现数据的完整性和一致性,约束和触发器是最为有效的两种方法。在SQL Server数据库中,约束和触发器各有其适用场景和优势。约束实现方法简单有效,适合实现简单的需求如主键、外键和域完整性要求。触发器则可以...

    用触发器实现数据库的完整性

    - **约束与触发器的关系**:如果在触发器表上定义了约束,则约束会在触发器之前进行检查。如果违反了约束,则触发器将不会被执行。 - **触发器的优先级**:一个表可以拥有多个触发器,可以通过设置来决定触发器的...

    数据库系统触发器实验 .doc

    实验还涉及了触发器与约束的对比。约束是另一种确保数据完整性的方式,例如,通过`ALTER TABLE`添加了一个CK_Grade约束,限制成绩必须在0到100之间。当试图违反这个约束时,数据库会拒绝执行违规的UPDATE语句。 ...

    用触发器实现SQLite的外键约束

    ### 使用触发器实现SQLite的外键约束 #### 背景与问题介绍 在进行数码相框嵌入式开发的过程中,开发团队选择了SQLite作为数据库管理系统。然而,在编码过程中遇到了一个较为棘手的问题:SQLite默认情况下不支持...

    数据库程序设计中的约束、触发器和存储过程

    数据库程序设计中的约束、触发器和存储过程

    数据库系统概论(王珊第五版)数据库实验9.doc

    最后,比较约束与触发器的执行顺序,可以创建一个包含`CHECK`约束和触发器的表,然后尝试插入违反两者规则的记录,观察哪个先起作用。 通过这个实验,你可以深入理解数据库完整性约束和触发器在实际操作中的应用,...

    探析SQL Server触发器与完整性约束的区别.pdf

    在本文中,我们将详细探讨SQL Server中触发器与完整性约束的区别。 完整性约束是数据库中用于确保数据准确性和一致性的规则,通常包括以下几种类型: 1. 实体完整性约束:每个数据表都应有一个主键约束,确保数据...

    SQL Server用触发器强制执行业务规则

    触发器可以引用其他表中的列,进行更复杂的逻辑判断,例如在插入或更新数据时,与另一个表中的数据进行比较或执行额外操作。 3. 同一表上的多个同类触发器(INSERT、UPDATE或DELETE)可以针对相同的修改语句执行不同...

    触发器与逻辑电路介绍

    总的来说,触发器与逻辑电路是数字系统的基础构建模块,理解它们的工作原理和特性对于设计和分析复杂的数字系统至关重要。掌握这些知识,可以进一步深入到微处理器、存储器、接口电路等更高级的数字系统设计。

    08第8 章完整性.pdf

    - **完整性约束与触发器**,使用触发器来实现复杂的完整性约束逻辑。 - **完整性约束与元数据**,系统目录(catalog)记录了数据库中定义的所有完整性约束信息。 - **完整性约束与存储过程**,在执行数据修改操作...

    触发器触发器触发器触发器

    4. **INSTEAD OF触发器**:与前三者不同,这种触发器可以在DML(数据操纵语言)操作发生之前或之后替代实际的操作,允许对操作进行自定义处理。 5. **AFTER触发器**:在DML操作完成后执行,常用于确保操作的结果满足...

    查看数据库中已有触发器、约束和索引并获得相应脚本

    在数据库管理与维护过程中,了解现有的触发器、约束以及索引对于优化性能、确保数据完整性至关重要。本文将详细介绍如何通过SQL语句查询数据库中的触发器、约束和索引,并获取相应的创建脚本。这对于日常的数据库...

    数据库实验6 触发器

    接下来,我们需要在客户表中创建一个删除后触发器,以确保只有当销售表中没有与该客户相关的记录时,才能删除客户信息。这可以通过查询销售表来实现,如果存在相关记录,则不允许删除。示例SQL脚本如下: ```sql ...

    数据库作业第三章.pdf

    在数据库设计中,完整性是确保数据准确无误的关键因素。...这些内容都围绕着数据库完整性、SQL Server的规则定义、约束与触发器的区别以及关系代数的操作展开,旨在加深对数据库系统基本概念的理解和应用。

    SQL Server数据库实验_存储过程与触发器设计.docx

    在SQL Server数据库中,存储过程和触发器是两种重要的数据库对象,它们在数据管理与业务逻辑处理中扮演着关键角色。 存储过程是预编译的SQL语句集合,它可以包含一系列的数据操作,如查询、更新、插入和删除等。...

Global site tag (gtag.js) - Google Analytics