了解 DELETE 和 DROP 命令
Understanding DELETE and DROP command
我是计算机科学专业的学生。最近想学数据库。我发现 link 描述了 DELETE 和 DROP 命令之间的区别。我了解它们与最重要的一个之间的大部分区别 - DELETE 仅删除 DROP 也删除 table/object 的数据。
但我无法理解一个区别 - DELETE 命令会触发 DML 触发器,而 DROP 不会触发任何 DML 触发器。 link 只是陈述这个事实,没有任何解释。谁能解释一下,让我更明白。
DELETE
保留 table 但删除其中的部分或全部行。 DROP
删除 table 及其所有数据,因此 table 不再存在。
DROP 删除 table 以及数据和其他结构,例如约束、索引、授权和触发器。所以触发器不会触发,因为在处理过程中它也被删除了。
"DELETE command fire a DML trigger where DROP doesn't fire any DML trigger"'
在 Oracle 和其他一些数据库中提供了触发器。触发器注意到但子例程将在 DML 操作上执行,如插入、更新、删除 ..
比如说更新 table 中的某些行,可以调用触发器。
同样在执行delete语句的时候,可以执行一个触发器。要获得更多理解,请通读触发器。
delete and name explains 将删除 table 中的全部或部分行,具体取决于您的规范和要求,
其中 as drop 将从架构中删除 table。
至于触发器,这里有一个例子。(它们只在 dmls 上触发,不在 ddls 上触发,)
我有一个名为 testmp2 的 table,它包含员工详细信息和另一个 table testdelvalues,它仅用于存储已删除员工记录的详细信息。
这是我正在使用的示例触发器。
SQL> CREATE OR REPLACE TRIGGER testempdel
2 AFTER delete ON testemp2
3 FOR EACH ROW
4 BEGIN
5 INSERT INTO testdelvalues (empno,empname) values (:Old.empno,:Old.ename);
6 END;
7 /
Trigger created.
这些是员工table的所有记录。
SQL> select * from testemp2;
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
---------- ---------- --------- ---------- --------- ---------- ---------- ----------
7369 SMITH CLERK 7902 17-DEC-80 800 20
7499 ALLEN SALESMAN 7698 20-FEB-81 1600 300 30
7521 WARD SALESMAN 7698 22-FEB-81 1250 500 30
7566 JONES MANAGER 7839 02-APR-81 2975 20
当前 testdelvalues 值为空。
SQL> select * from testdelvalues;
no rows selected
现在我从 table 中删除一条记录,这将触发删除触发器以将值存储到 testdelvalues 中,存储删除的员工 empno 和姓名。
SQL> delete from testemp2 where empno=7369;
1 row deleted.
SQL> commit;
Commit complete.
记录的详细信息,使用删除触发器插入。
SQL> select * from testdelvalues;
EMPNO EMPNAME
---------- ----------
7369 SMITH
我是计算机科学专业的学生。最近想学数据库。我发现 link 描述了 DELETE 和 DROP 命令之间的区别。我了解它们与最重要的一个之间的大部分区别 - DELETE 仅删除 DROP 也删除 table/object 的数据。
但我无法理解一个区别 - DELETE 命令会触发 DML 触发器,而 DROP 不会触发任何 DML 触发器。 link 只是陈述这个事实,没有任何解释。谁能解释一下,让我更明白。
DELETE
保留 table 但删除其中的部分或全部行。 DROP
删除 table 及其所有数据,因此 table 不再存在。
DROP 删除 table 以及数据和其他结构,例如约束、索引、授权和触发器。所以触发器不会触发,因为在处理过程中它也被删除了。
"DELETE command fire a DML trigger where DROP doesn't fire any DML trigger"'
在 Oracle 和其他一些数据库中提供了触发器。触发器注意到但子例程将在 DML 操作上执行,如插入、更新、删除 .. 比如说更新 table 中的某些行,可以调用触发器。
同样在执行delete语句的时候,可以执行一个触发器。要获得更多理解,请通读触发器。
delete and name explains 将删除 table 中的全部或部分行,具体取决于您的规范和要求, 其中 as drop 将从架构中删除 table。
至于触发器,这里有一个例子。(它们只在 dmls 上触发,不在 ddls 上触发,) 我有一个名为 testmp2 的 table,它包含员工详细信息和另一个 table testdelvalues,它仅用于存储已删除员工记录的详细信息。
这是我正在使用的示例触发器。
SQL> CREATE OR REPLACE TRIGGER testempdel
2 AFTER delete ON testemp2
3 FOR EACH ROW
4 BEGIN
5 INSERT INTO testdelvalues (empno,empname) values (:Old.empno,:Old.ename);
6 END;
7 /
Trigger created.
这些是员工table的所有记录。
SQL> select * from testemp2;
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
---------- ---------- --------- ---------- --------- ---------- ---------- ----------
7369 SMITH CLERK 7902 17-DEC-80 800 20
7499 ALLEN SALESMAN 7698 20-FEB-81 1600 300 30
7521 WARD SALESMAN 7698 22-FEB-81 1250 500 30
7566 JONES MANAGER 7839 02-APR-81 2975 20
当前 testdelvalues 值为空。
SQL> select * from testdelvalues;
no rows selected
现在我从 table 中删除一条记录,这将触发删除触发器以将值存储到 testdelvalues 中,存储删除的员工 empno 和姓名。
SQL> delete from testemp2 where empno=7369;
1 row deleted.
SQL> commit;
Commit complete.
记录的详细信息,使用删除触发器插入。
SQL> select * from testdelvalues;
EMPNO EMPNAME
---------- ----------
7369 SMITH