创建例子
create table toys (
toy_name varchar2(30),
price number(4, 2)
);
insert into toys values ('Baby Turtle', 0.01);
insert into toys values ('Miss Snuggles', 0.51);
insert into toys values ('Cuteasaurus', 10.01);
insert into toys values ('Sir Stripypants', 14.03);
insert into toys values ('Purple Ninja', 14.22);
commit;
select * from toys
Delete:Delete 是另一种形式的 DML 语句。您可以使用它从表中删除行。
delete from toys;
rollback;
delete toys where price < 1;
Truncate 截断
使用 truncate 从表中删除所有行。与删除不同,这是 Oracle 数据库中的数据定义语言 (DDL) 语句
truncate table toys;
注意,即使在回滚之后,该表仍然是空的
截断也是一个全有或全无的语句。您不能使用 where 子句删除某些行。
truncate table toys where price < 1;
截断速度很快。它将表标记为空而不触及数据。因此,无论表存储多少行,截断操作都是即时的。
而删除处理每一行。所以随着表中行数的增加,将它们全部删除的时间也会增加。删除数百万行可能需要数小时才能完成!
截断还会释放表的存储空间。但是空间仍然分配给带有删除的表。
软删除
alter table toys add is_deleted varchar2(1) default 'N';
insert into toys values ('Baby Turtle', 0.01, 'N');
insert into toys values ('Miss Snuggles', 0.51, 'N');
insert into toys values ('Cuteasaurus', 10.01, 'N');
insert into toys values ('Sir Stripypants', 14.03, 'N');
insert into toys values ('Purple Ninja', 14.22, 'N');
现在,要“删除”行,请运行更新。这将删除标志设置为是
update toys
set is_deleted = 'Y'
where toy_name = 'Cuteasaurus';
select * from toys
where is_deleted = 'N';
最通用的方法是在表格顶部创建一个视图。这包含不包括“已删除”行的查询。
create or replace view active_toys as
select * from toys
where is_deleted = 'N';
select * from active_toys;
数据库内归档
Oracle Database 12c 引入了数据库内归档。这提供了一种显示或隐藏已删除行的新方法。
alter table toys row archival;
update toys
set ora_archive_state = '1'
where toy_name = 'Baby Turtle';
将行档案可见性设置为全部,您将看到所有内容
alter session set row archival visibility = active;
select * from toys;
要自动过滤掉已删除的行,请将可见性设置为活动
只显示4条数据了