删除行 Delete truncate 软删除 db官方例子

创建例子

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条数据了 

 

猜你喜欢

转载自blog.csdn.net/weixin_39568073/article/details/121206852