MySQL是一種開源的關(guān)系型數(shù)據(jù)庫(kù)管理系統(tǒng)。在MySQL中,當(dāng)數(shù)據(jù)被從數(shù)據(jù)庫(kù)表中刪除時(shí),讀取這些被刪除的數(shù)據(jù)的過(guò)程可能會(huì)變得復(fù)雜。在本文中,我們將討論MySQL如何讀取到被刪除的數(shù)據(jù)。
當(dāng)刪除MySQL中的某些數(shù)據(jù)時(shí),這些數(shù)據(jù)并沒有真正從磁盤中刪除,而是被標(biāo)記為“已刪除”。MySQL會(huì)將這些被刪除的數(shù)據(jù)放在一個(gè)稱為“回滾段”的區(qū)域中,這個(gè)區(qū)域可以用來(lái)實(shí)現(xiàn)事務(wù)的回滾操作。事實(shí)上,這個(gè)回滾段是MySQL用于實(shí)現(xiàn)ACID事務(wù)的機(jī)制之一。
如果您嘗試從已刪除數(shù)據(jù)的表中讀取數(shù)據(jù),您會(huì)發(fā)現(xiàn)MySQL會(huì)返回一個(gè)空結(jié)果集。這是因?yàn)镸ySQL默認(rèn)情況下不會(huì)返回被刪除的數(shù)據(jù)。然而,您可以通過(guò)設(shè)置參數(shù)來(lái)更改這個(gè)默認(rèn)行為。
-- 查看當(dāng)前的配置 SHOW VARIABLES LIKE 'sql_mode'; -- 將sql_mode參數(shù)中的NO_ENGINE_SUBSTITUTION值修改為NO_ENGINE_SUBSTITUTION, NO_BACKSLASH_ESCAPES SET GLOBAL sql_mode="NO_ENGINE_SUBSTITUTION, NO_BACKSLASH_ESCAPES"; -- 創(chuàng)建一個(gè)表,插入一些數(shù)據(jù)并刪除這些數(shù)據(jù) CREATE TABLE `test` ( `id` int(11) NOT NULL AUTO_INCREMENT PRIMARY KEY, `name` varchar(255) NOT NULL ); INSERT INTO `test` (`name`) VALUES ('Alice'), ('Bob'), ('Charlie'); DELETE FROM `test`; -- 從已刪除的數(shù)據(jù)的表中讀取數(shù)據(jù) SELECT * FROM `test`; -- 可以看到,MySQL返回了被刪除的數(shù)據(jù)
以上代碼中,我們首先查看了當(dāng)前的SQL模式配置,然后將SQL模式參數(shù)中的NO_ENGINE_SUBSTITUTION值修改為NO_ENGINE_SUBSTITUTION, NO_BACKSLASH_ESCAPES。這會(huì)導(dǎo)致MySQL返回被刪除的數(shù)據(jù)。接下來(lái),我們創(chuàng)建了一個(gè)表,插入了一些數(shù)據(jù),并刪除了這些數(shù)據(jù)。最后,我們嘗試從已刪除的數(shù)據(jù)的表中讀取數(shù)據(jù),可以看到MySQL返回了被刪除的數(shù)據(jù)。
如果您不需要讀取被刪除的數(shù)據(jù),建議將SQL模式參數(shù)改回默認(rèn)值,以提高系統(tǒng)性能。
-- 將sql_mode參數(shù)中的NO_ENGINE_SUBSTITUTION, NO_BACKSLASH_ESCAPES值修改回NO_ENGINE_SUBSTITUTION SET GLOBAL sql_mode="NO_ENGINE_SUBSTITUTION"; -- 查看當(dāng)前的配置,可以看到sql_mode參數(shù)改回了NO_ENGINE_SUBSTITUTION SHOW VARIABLES LIKE 'sql_mode';
在本文中,我們討論了MySQL如何讀取到被刪除的數(shù)據(jù)。雖然如果您不需要將它們讀取出來(lái)可以提高系統(tǒng)性能,但如果需要,可以通過(guò)設(shè)置SQL模式參數(shù)來(lái)實(shí)現(xiàn)。