在本教程中,您将学习如何使用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
系统权限。
下面我们来看看使用TRUNCATE TABLE
语句来删除表的一些例子。
以下语句创建一个名为customers_copy
的表,并从示例数据库中的customers
表复制数据:
CREATE TABLE customers_copy AS SELECT * FROM customers;
要从customers_copy
表中删除所有行,请使用以下TRUNCATE TABLE
语句:
TRUNCATE TABLE customers_copy;
首先,创建用来演示的两个表: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
语句更快更有效地从表中删除所有数据。