回答
在Oracle中,答案爲否,因爲回滾段僅用於DML。
TRUNCATE是DDL。
好吧。 還有1個問題。我知道刪除是DML,截斷是DDL。 給出了名爲員工的表格, 1.刪除與員工之間的區別是什麼? 和 2.截斷員工; 什麼時候使用每個? – user319280 2010-04-23 23:00:58
截斷速度更快,部分原因是它不會生成回退。這導致了至少兩個重要的區別:顯然它不能被回滾,並且獨立於提交而立即生效。假設你想清空並重新填充表格。如果您刪除,插入,提交,那麼就其他用戶而言,表永遠不會爲空,並且如果您回滾舊數據,則會恢復。如果您截斷,插入,提交,則所有其他會話都會在截斷和提交之間看到一個空表,這可能會導致問題,並且如果插入失敗並回滾,它將保持爲空。 – 2010-04-23 23:53:09
答案很有道理! – user319280 2010-04-24 07:37:08
每個DDL語句都是離散事務。這是因爲數據庫需要管理其元數據(Oracle中的數據字典)。基本上它必須始終進行糾正和驗證,因此元數據的更改無法回滾。因此,在每個DDL語句之前和之後都會發布隱含的commit
。這適用於大多數,可能是所有的RDBMS產品。
TRUNCATE TABLE和DROP TABLE都是DDL語句都是DDL,所以沒有回滾。如果我們擁有針對Oracle最新版本的Enterprise Edition許可證,我們可以使用FLASHBACK TABLE將表格恢復到以前的狀態,包括BEFORE DROP。
編輯
這裏是DELETE和TRUNCATE TABLE之間的差異。這個例子日期是這個大表:
SQL> exec dbms_stats.gather_table_stats(user,'BIG_TABLE')
PL/SQL procedure successfully completed.
SQL> select blocks, num_rows
2 from user_tables
3 where table_name = 'BIG_TABLE'
4/
BLOCKS NUM_ROWS
---------- ----------
15449 2340320
SQL>
刪除第一....
SQL> delete from big_table
2/
2340320 rows deleted.
Elapsed: 00:01:20.37
SQL>
SQL> exec dbms_stats.gather_table_stats(user,'BIG_TABLE')
PL/SQL procedure successfully completed.
Elapsed: 00:00:10.20
SQL>
SQL> select blocks, num_rows
2 from user_tables
3 where table_name = 'BIG_TABLE'
4/
BLOCKS NUM_ROWS
---------- ----------
15449 0
Elapsed: 00:00:00.11
SQL>
而且現在的截斷......
SQL> truncate table big_table reuse storage
2/
Table truncated.
Elapsed: 00:00:08.31
SQL> exec dbms_stats.gather_table_stats(user,'BIG_TABLE')
PL/SQL procedure successfully completed.
Elapsed: 00:00:00.26
SQL>
SQL> select blocks, num_rows
2 from user_tables
3 where table_name = 'BIG_TABLE'
4/
BLOCKS NUM_ROWS
---------- ----------
0 0
Elapsed: 00:00:00.00
SQL>
之間的差異是顯而易見的。 TRUNCATE要快得多。它也已經將表格中的塊數歸零。請注意,截斷後即使收集統計信息也會更快。這是因爲TRUNCATE語句重置高水位標記(即零塊),所以作業知道所有分配的塊都未使用。
刪除並截斷寫入回滾段。
由於Oracle在自動啓動和提交的單獨事務中執行每個DDL語句,因此您無法自行回滾。
它的工作原理是這樣的:
begin
COMMIT; -- any outstanding work
begin
DDL statement;
COMMIT; -- the DDL statement
exception
when others then
ROLLBACK; -- any work done by the DDL
RAISE; -- reraise the exception back to the client
end;
end;
在DDL語句甲骨文的中間系統崩潰的情況下,將能夠回滾中斷操作。信息來源:article on Ask Tom。
你必須看看這個網站
http://moreno-campos.com/2009/10/19/reversing-the-effect-of-a-truncate-table-in-oracle-11gr2/
我會建議詳細說明爲什麼網站有幫助。 – AlexKoren 2015-08-24 22:27:41
- 1. 我們可以在刪除,刪除和截斷中回滾嗎?
- 2. 截斷和刪除字符
- 3. ORA刪除/截斷
- 4. mysql截斷表vs刪除
- 5. MySQL刪除確定但截斷失敗
- 6. 截斷或刪除並創建表
- 7. 刪除,截斷或刪除清理MySQL中的表格
- 8. 在SQL Server中同時選擇和截斷或刪除
- 9. 什麼是截斷表A和刪除的區別從A
- 10. 防止更新,刪除和截斷數據庫表
- 11. 錯誤:com.mysql.jdbc.MysqlDataTruncation:數據截斷:截斷不正確DOUBLE值:通過刪除
- 12. 在$ http的截斷字段
- 13. AS3文本字段,截斷
- 14. php截斷字段問題
- 15. NSMenuItem:截斷和setLineBreakMode
- 16. 截斷toBinaryString否定回答
- 17. 刪除captureVisibleTab截圖
- 18. Oracle回滾段和ADO.NET
- 19. 用`.createSQLQuery`截斷後彈簧/休眠不回滾事務
- 20. 截斷和刪除索引比刪除表的性能更好,創建故事和創建索引?
- 21. Xcode刪除的圖像不斷回來
- 22. 刪除的行不斷回來
- 23. jQuery刪除class item不斷回來
- 24. 刪除斷點
- 25. 刪除斷線
- 26. Django截斷,如果不發生截斷,則返回false?
- 27. 攔截EJB事務回滾
- 28. 添加和刪除攔截器
- 29. 刪除VS回滾策略 - ETL負載
- 30. Install4j在回滾期間刪除response.varfile
你的問題都標記'oracle'和'mysql'。如果你想讓你的問題得到解答,我想你應該在你的問題中說清楚。 – 2010-04-23 20:50:02
只爲oracle會做 – user319280 2010-04-23 20:56:39