MYSQL中的刪除語句

1. 背景介紹

MySQL是一種開放源代碼的關係型數據庫管理系統(RDBMS),使用最常用的數據庫管理語言--結構化查詢語言(SQL)進行數據庫管理。

“SQL” ----是用於訪問和處理數據庫的標準的計算機語言,簡稱結構化查詢語言

SQL中的刪除語句一共有四種,分別對應不同的功能

2. 四種刪除語句

delete

delete from table_name where some_column=some_value

用於刪除表中的行

delete from table_name/delete * from table_name;

用於刪除表中所有的行,也就是刪除表中所有的數據

drop

drop table table_name;

用於刪除整個表,包括表結構

drop database database_name;

用於刪除數據庫

alter

(alter語句屬於drop語句的分支)

alter table table_name drop column column_name;

用於刪除表中的列

alter table table_name drop index index_name;

用於刪除表中的索引

truncate

truncate table table_name;

用於刪除表內的數據

 

3. 常見問題

四種刪除語句中哪些功能是相同的?

哪些功能是不同的?

刪除後可以恢復嗎?哪些刪除是可以恢復的?怎麼恢復?

 

四種刪除語句中哪些功能是相同的?

1.truncate和不帶where子句的delete,以及drop都能刪除表內的數據

2.truncate和delete只刪除表數據保留表結構

 

哪些功能是不同的?

delete

1、delete語句爲數據操作語言(DML,data maintain Language),這個操作會被放到 rollback segment中,事務提交後才生效。如果有相應的 trigger,執行的時候將被觸發。

  並且同時將該行的的刪除操作記錄在undo和redo表空間中以便進行回滾(rollback)和重做操作,但要注意表空間要足夠大,需要手動提交(commit)操作才能生效,

  可以通過rollback撤消操作。

2、delete可根據條件刪除表中滿足條件的數據,如果不指定where子句,那麼刪除表中所有記錄。

3、delete語句不影響表所佔用的extent,高水線(high watermark)保持原位置不變。

truncate

1.truncate是數據定義語言(DDL,data define language),操作立即生效,原數據不放到 rollback segment中,不能回滾

2.truncate table一次性地從表中刪除所有的數據並不把單獨的刪除操作記錄記入日誌保存,刪除行是不能恢復的。

並且在刪除的過程中不會激活與表有關的刪除觸發器。執行速度快。

truncate table比 delete 速度快,且使用的系統和事務日誌資源少。

delete 語句每次刪除一行,並在事務日誌中爲所刪除的每行記錄一項。truncate table 通過釋放存儲表數據所用的數據頁來刪除數據,並且只在事務日誌中記錄頁的釋放。

drop

1、drop是數據定義語言(DDL,data define language),會隱式提交,所以,不能回滾,不會觸發觸發器。

2、drop語句刪除表結構及所有數據,並將表所佔用的空間全部釋放。

3、drop語句將刪除表的結構所依賴的約束,觸發器,索引,依賴於該表的存儲過程/函數將保留,但是變爲invalid狀態。

 

1.在速度上,一般來說,drop> truncate > delete.

2、在使用drop和truncate時一定要注意,雖然可以恢復,但爲了減少麻煩,還是要慎重。

3、如果想刪除部分數據用delete,注意帶上where子句,回滾段要足夠大;如果想刪除表,當然用drop;

 

如果想保留表而將所有數據刪除,如果和事務無關,用truncate即可;

如果和事務有關,或者想觸發trigger,還是用delete;

如果是整理表內部的碎片,可以用truncate跟上reuse storage,再重新導入/插入數據。

 

刪除後可以恢復嗎?哪些刪除是可以恢復的?

數據庫刪除後的數據想要恢復分三種情況:

1.有沒有備份?

2.有沒有開啓binlog?

3.如果兩者都沒開,只能使用第三方恢復軟件,或者找專業的數據恢復公司

用備份語句恢復

備份:mysqldump -u root -p database_name  > E:/filename.sql

恢復:mysql  -u root -p database_name  < E:/filename.sql

選擇性備份:mysqldump -u root -p database_name table1 table2 ...  > E:/filename.sql

全部備份:mysqldump -u root -p --all-databases > E:/filename.sql

用binlog恢復

binlog是二進制日誌,簡單的理解就是將數據庫中的數據以二進制的形式記錄下來,默認形式是hostname.00000x(x=1,2,3...)。

此外,mysqlbinlog生成的備份文件是動態備份。binlog日誌會將我們對數據的所有操作都記錄下來,

它就像是一個工作在後臺的監視器,以一定的時間間隔查看我們在此段時間內執行的操作,並將之記錄下來。

如何開啓log_bin?(window系統)

mysql安裝完後有個默認目錄:C:\ProgramData\MySQL\MySQL Server 5.7 ,其下有個my.ini文件,在安裝過程中該文件已經被配置好了,

字符集(utf8),datadir ,端口號3306......配置的很詳細, 要開啓log_bin,很簡單,只需要將my.ini中#log-bin 前的 # 去掉即可

(二進制logbin文件存儲的位置默認爲:C:\ProgramData\MySQL\MySQL Server 5.7\Data)

mysql重啓完後,然後我們藉助:show variables like 'log_bin'; 便可查看log_bin是否開啓

 

參考文獻

馮亞超師兄PPT

http://blog.csdn.net/ws0513/article/details/49980547?%3E

http://blog.csdn.net/qq_34722749/article/details/69388376

更多討論

怎麼恢復數據庫的自增id從1開始?

truncate tablename......

與delete的區別?

delete刪除之後id會繼續延續上一個

truncate刪除之後從1開始id

若想保持記錄呢?

可以直接刪除id那一列

然後再加上新的id從1開始

------------------------------------------------------------------------------------------------------------------------


作者:Princiman
鏈接:https://www.jianshu.com/p/1c5c75b86356

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章