Oracle截断表
在本教程中,您将学习如何使用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
语句更快更有效地从表中删除所有数据。