在本教學中,您將學習如何使用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
語句更快更有效地從表中刪除所有資料。