天天看點

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語句更快更有效地從表中删除所有資料。