oracle truncate写法,Oracle Truncate Table

oracle函数 的 Oracle Truncate Table

在本教程中,您将学习如何使用Oracle TRUNCATE TABLE语句更快更有效地从表中删除所有数据(也叫截断表)。

Oracle TRUNCATE TABLE语句简介

如果要从表中删除所有数据,可以使用不带WHERE子句的DELETE语句,如下所示:

DELETE FROM table_name;

对于有少量行记录的表,DELETE语句做得很好。 但是,当拥有大量行记录的表时,使用DELETE语句删除所有数据效率并不高。

Oracle引入了TRUNCATE TABLE语句,用于删除大表中的所有行。

以下说明了Oracle TRUNCATE TABLE语句的语法:

TRUNCATE TABLE schema_name.table_name

[CASCADE]

[[ PRESERVE | PURGE] MATERIALIZED VIEW LOG ]]

[[ DROP | REUSE]] STORAGE ]

默认情况下,要从表中删除所有行,请指定要在TRUNCATE TABLE子句中截断的表的名称:

TRUNCATE TABLE table_name;

在这种情况下,因为我们没有明确指定模式名称,所以Oracle假定从当前的模式中截断表。

如果表通过外键约束与其他表有关系,则需要使用CASCADE子句:

TRUNCATE TABLE table_name

CASCADE;

在这种情况下,TRUNCATE TABLE CASCADE语句删除table_name表中的所有行,并递归地截断链中的关联表。

请注意,TRUNCATE TABLE CASCADE语句需要使用ON DELETE CASCADE子句定义的外键约束才能工作。

通过MATERIALIZED VIEW LOG子句,可以指定在表上定义的物化视图日志是否在截断表时被保留或清除。 默认情况下,物化视图日志被保留。

STORAGE子句允许选择删除或重新使用由截断行和关联索引(如果有的话)释放的存储。 默认情况下,存储被删除。

请注意,要截断表,它必须在您自己的模式中,或者必须具有DROP ANY TABLE系统权限。

Oracle TRUNCATE TABLE示例

下面我们来看看使用TRUNCATE TABLE语句来删除表的一些例子。

1. Oracle TRUNCATE TABLE简单的例子

以下语句创建一个名为customers_copy的表,并从示例数据库中的customers表复制数据:

CREATE TABLE customers_copy

AS

SELECT

*

FROM

customers;

要从customers_copy表中删除所有行,请使用以下TRUNCATE TABLE语句:

TRUNCATE TABLE customers_copy;

2. Oracle TRUNCATE TABLE CASCADE示例

首先,创建用来演示的两个表:quotations和quotation_items表:

CREATE TABLE quotations (

quotation_no NUMERIC GENERATED BY DEFAULT AS IDENTITY,

customer_id NUMERIC NOT NULL,

valid_from DATE NOT NULL,

valid_to DATE NOT NULL,

PRIMARY KEY(quotation_no)

);

CREATE TABLE quotation_items (

quotation_no NUMERIC,

item_no NUMERIC ,

product_id NUMERIC NOT NULL,

qty NUMERIC NOT NULL,

price NUMERIC(9 , 2 ) NOT NULL,

PRIMARY KEY (quotation_no , item_no),

CONSTRAINT fk_quotation FOREIGN KEY (quotation_no)

REFERENCES quotations

ON DELETE CASCADE

);

接下来,在这两个表中插入一些行:

INSERT INTO quotations(customer_id, valid_from, valid_to)

VALUES(100, DATE '2017-09-01', DATE '2017-12-01');

INSERT INTO quotation_items(quotation_no, item_no, product_id, qty, price)

VALUES(1,1,1001,10,90.5);

INSERT INTO quotation_items(quotation_no, item_no, product_id, qty, price)

VALUES(1,2,1002,20,200.5);

INSERT INTO quotation_items(quotation_no, item_no, product_id, qty, price)

VALUES(1,3,1003,30, 150.5);

然后,截断quotatios表:

TRUNCATE TABLE quotations;

执行语句失败,Oracle返回以下错误:

SQL Error: ORA-02266: unique/primary keys in table referenced by enabled foreign keys

要解决这个问题,可以将CASCADE子句添加到上面的TRUNCATE TABLE语句中:

TRUNCATE TABLE quotations CASCADE;

这个语句不仅从quotations表中删除数据,而且还从quotation_items表中删除数据。最后,验证是否删除了quotations和quotation_items中的数据:

SELECT

*

FROM

quotations;

SELECT

*

FROM

quotation_items;

请注意,如果没有为fk_quotation约束指定ON DELETE CASCADE,则上面的TRUNCATE TABLE CASCADE语句将失败。

在本教程中,我们学习了如何使用Oracle TRUNCATE TABLE语句更快更有效地从表中删除所有数据。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值