建立级联删除触发器CASCADE_DELETE,当删除部门时,级联删除EMP表的雇员记录。/*
CREATE TRIGGER CASCADE_DELETE
AFTER 
DELETE OF deptno
ON DEPT
FOR EACH ROW
BEGIN
DELETE  FROM EMP WHERE EMP.DEPTNO=:OLD.DEPTNO
END;
*/
delete from dept where deptno=50;
-- select * from emp;
--supdate emp set deptno=50  where empno=8888; 
--select * from dept;
程序提示: delete from dept where deptno=50
*
第 1 行出现错误:
ORA-02292: 违反完整约束条件 (BOOKLQZ.FK_DEPTNO) - 已找到子记录

解决方案 »

  1.   

    create or replace trigger CASCADE_DELETE
    after delete on dept
    for each row
    begin
    delete emp where deptno=:old.deptno;
    end;
    SQL> select * from emp;     EMPNO ENAME      JOB              MGR HIREDATE                   SAL       COMM     DEPTNO
    ---------- ---------- --------- ---------- ------------------- ---------- ---------- ----------
          7369 SMITH      CLERK           7902 1980-12-17 00:00:00        800        900         20
          7499 ALLEN      SALESMAN        7698 1981-02-20 00:00:00       1600        300         30
          7521 WARD       SALESMAN        7698 1981-02-22 00:00:00       1250        500         30
          7566 JONES      MANAGER         7839 1981-04-02 00:00:00       2975        900         20
          7654 MARTIN     SALESMAN        7698 1981-09-28 00:00:00       1250       1400         30
          7698 BLAKE      MANAGER         7839 1981-05-01 00:00:00       2850                    30
          7782 CLARK      MANAGER         7839 1981-06-09 00:00:00       2450                    10
          7788 SCOTT      ANALYST         7566 1987-04-19 00:00:00       3000        900         20
          7839 KING       PRESIDENT            1981-11-17 00:00:00       5000                    10
          7844 TURNER     SALESMAN        7698 1981-09-08 00:00:00       1500          0         30
          7876 ADAMS      CLERK           7788 1987-05-23 00:00:00       1100        900         20
          7900 JAMES      CLERK           7698 1981-12-03 00:00:00        950                    30
          7902 FORD       ANALYST         7566 1981-12-03 00:00:00       3000        900         20
          7934 MILLER     CLERK           7782 1982-01-23 00:00:00       1300                    10已选择14行。SQL> delete dept where deptno=30;已删除 1 行。SQL> select * from emp;     EMPNO ENAME      JOB              MGR HIREDATE                   SAL       COMM     DEPTNO
    ---------- ---------- --------- ---------- ------------------- ---------- ---------- ----------
          7369 SMITH      CLERK           7902 1980-12-17 00:00:00        800        900         20
          7566 JONES      MANAGER         7839 1981-04-02 00:00:00       2975        900         20
          7782 CLARK      MANAGER         7839 1981-06-09 00:00:00       2450                    10
          7788 SCOTT      ANALYST         7566 1987-04-19 00:00:00       3000        900         20
          7839 KING       PRESIDENT            1981-11-17 00:00:00       5000                    10
          7876 ADAMS      CLERK           7788 1987-05-23 00:00:00       1100        900         20
          7902 FORD       ANALYST         7566 1981-12-03 00:00:00       3000        900         20
          7934 MILLER     CLERK           7782 1982-01-23 00:00:00       1300                    10已选择8行。
      

  2.   

    请问父表有数据在子表,这样可以直接删除吗?你是不是原来的表里面没有增加约束条件??
    deptno是dept的主键,在emp中它是外键啊?
      

  3.   

    你修改了delete on和去掉delete from 中的from
      

  4.   

    我用的就是scott下的表,主外键都是有的
    after delete on dept --删除都是整行 不需要指定列
    delete from 和delete 是一样的
      

  5.   

    /*
    CREATE TRIGGER CASCADE_DELEDEPT
    AFTER DELETE ON dept
    FOR EACH ROW
    BEGIN
    DELETE  FROM EMP WHERE EMP.DEPTNO=:OLD.DEPTNO
    END;
    */
    show error
    --drop trigger cascade_delEdept;
    LINE/COL ERROR
    -------- -----------------------------------------------------------------
    2/1      PL/SQL: SQL Statement ignored
    3/3      PL/SQL: ORA-00933: SQL 命令未正确结束
    7/0      PLS-00103: 出现符号 "end-of-file"在需要下列之一时:
             begin case declare
             end exception exit for goto if loop mod null pragma raise
             return select update while with <an identifier>
             <a double-quoted delimited-identifier> <a bind variable> <<
             close current delete fetch lock insert open rollback
             savepoint set sql execute commit forall merge pipe
      

  6.   

    DELETE FROM EMP WHERE EMP.DEPTNO=:OLD.DEPTNO
    少了分号
      

  7.   


    --为什么不用外键的记录删除的特性CREATE TRIGGER CASCADE_DELEDEPT AFTER DELETE ON dept FOR EACH ROW
    BEGIN
    DELETE FROM EMP WHERE EMP.DEPTNO=:OLD.DEPTNO;--分号
    END;
      

  8.   

    删除deptno某个字段就有外键约束限制?而删除一行则没限制吗
      

  9.   

    after delete on dept --删除都是整行 不需要指定列如果我不使用2楼的删除,只是仅仅删除DEPT表中的某行,应为deptno是外键,所有删除不了dept表中的整行???
    2楼的方法相当于平时我们所使用的级联删除方法???