新聞中心
PostgreSQL 是一個(gè)流行的開源數(shù)據(jù)庫(kù)管理系統(tǒng),可以在各種操作系統(tǒng)上運(yùn)行。與其他數(shù)據(jù)庫(kù)管理系統(tǒng)相比,PostgreSQL 具有許多優(yōu)點(diǎn),如高可靠性,數(shù)據(jù)完整性以及良好的擴(kuò)展性。在進(jìn)行數(shù)據(jù)庫(kù)管理和維護(hù)時(shí),刪除數(shù)據(jù)是一個(gè)經(jīng)常需要執(zhí)行的操作。本文將介紹 PostgreSQL 數(shù)據(jù)庫(kù)中的刪除操作指南。

1. 刪除數(shù)據(jù)庫(kù)
在 PostgreSQL 中,如果您想刪除整個(gè)數(shù)據(jù)庫(kù),可以使用以下命令:
DROP DATABASE database_name;
其中,database_name 是要?jiǎng)h除的數(shù)據(jù)庫(kù)的名稱。請(qǐng)注意,這個(gè)命令將刪除這個(gè)數(shù)據(jù)庫(kù)以及它包含的所有表和數(shù)據(jù)。在執(zhí)行此命令之前,請(qǐng)確保您已經(jīng)備份所有重要的數(shù)據(jù),以防止不必要的數(shù)據(jù)丟失。
2. 刪除表
如果您只想刪除一個(gè)表,可以使用以下命令:
DROP TABLE table_name;
在這個(gè)命令中,table_name 是您要?jiǎng)h除的表的名稱。此命令將完全刪除該表及其所有行。在刪除之前,請(qǐng)確保您備份了表中的所有數(shù)據(jù)。
3. 刪除行
如果您只想刪除表中的一些行,而不是整個(gè)表,可以使用 DELETE 命令。以下是一個(gè)示例:
DELETE FROM table_name WHERE condition;
在這個(gè)命令中,table_name 是您要?jiǎng)h除行的表的名稱。condition 是您要滿足才能執(zhí)行刪除操作的條件。請(qǐng)注意,這個(gè)命令將永久刪除這些行,所以請(qǐng)?jiān)趫?zhí)行之前謹(jǐn)慎檢查您的條件。
4. 刪除列
如果您想從表中刪除一列,可以使用 ALTER TABLE 命令。以下是一個(gè)示例:
ALTER TABLE table_name DROP COLUMN column_name;
在這個(gè)命令中,table_name 是您要?jiǎng)h除列的表的名稱。column_name 是您要?jiǎng)h除的列的名稱。請(qǐng)注意,在執(zhí)行此操作之前,請(qǐng)確保沒有其他表依賴于該列。
5. 級(jí)聯(lián)刪除
如果您在父表中刪除一行時(shí),希望相關(guān)的子表也跟著刪除,可以使用級(jí)聯(lián)刪除。以下是一個(gè)示例:
CREATE TABLE parent_table (
parent_id integer PRIMARY KEY,
parent_name text
);
CREATE TABLE child_table (
child_id integer PRIMARY KEY,
child_name text,
parent_id integer REFERENCES parent_table (parent_id) ON DELETE CASCADE
);
在這個(gè)示例中,子表包含對(duì)父表的引用,并使用 ON DELETE CASCADE 子句進(jìn)行配置。這意味著,每當(dāng)您在父表中刪除一行時(shí),所有相關(guān)的子表行也將被刪除。
在 PostgreSQL 中,刪除數(shù)據(jù)是一個(gè)非常常見的操作。您可以使用 DROP DATABASE 命令刪除整個(gè)數(shù)據(jù)庫(kù),DROP TABLE 命令刪除整個(gè)表,DELETE 命令刪除特定的行,ALTER TABLE 命令刪除特定的列。如果需要,您可以使用級(jí)聯(lián)刪除來(lái)自動(dòng)刪除相關(guān)的子表。在執(zhí)行任何刪除命令之前,請(qǐng)確保您已經(jīng)做好備份,并仔細(xì)檢查所有的條件。
成都網(wǎng)站建設(shè)公司-創(chuàng)新互聯(lián),建站經(jīng)驗(yàn)豐富以策略為先導(dǎo)10多年以來(lái)專注數(shù)字化網(wǎng)站建設(shè),提供企業(yè)網(wǎng)站建設(shè),高端網(wǎng)站設(shè)計(jì),響應(yīng)式網(wǎng)站制作,設(shè)計(jì)師量身打造品牌風(fēng)格,熱線:028-86922220數(shù)據(jù)庫(kù)詳解之事務(wù)
究竟什么是數(shù)據(jù)庫(kù)的事務(wù),為什么數(shù)據(jù)庫(kù)需要支持事務(wù),為了實(shí)現(xiàn)數(shù)據(jù)庫(kù)事務(wù)各種數(shù)據(jù)庫(kù)的是如何設(shè)計(jì)的。還是只談理解,歡迎大家來(lái)討論。
1. 數(shù)據(jù)庫(kù)事務(wù)是什么
事務(wù)的定義,已經(jīng)有太多文章寫過,我就不重復(fù)了。我理解的事務(wù)就是用來(lái)保證數(shù)據(jù)操作符合業(yè)務(wù)邏輯要求而實(shí)現(xiàn)的一系列功能。換句話說(shuō),如果數(shù)據(jù)庫(kù)不支持事務(wù),上面業(yè)務(wù)系統(tǒng)的程序員就需要自己寫代碼保證相關(guān)數(shù)據(jù)處理邏輯的正確性。而數(shù)據(jù)庫(kù)事務(wù)就是把一系列保證數(shù)據(jù)庫(kù)處理邏輯正確性的通用功能在數(shù)據(jù)庫(kù)內(nèi)實(shí)現(xiàn),并且盡量提高效率。
舉個(gè)例子,數(shù)據(jù)庫(kù)最開始普及就是在金融業(yè),銀行的存取款場(chǎng)景就是一個(gè)最典型的OLTP數(shù)據(jù)庫(kù)場(chǎng)景,而事務(wù)就是設(shè)計(jì)用來(lái)保證類似場(chǎng)景的業(yè)務(wù)邏輯正確性的。
!(
,type_ZHJvaWRzYW5zZmFGJhY2s,shadow_50,text_Q1NETiBAd2luZHRhbGtlcnd5,size_20,color_FFFFFF,t_70,g_se,x_16)
**原子性**,如果你要給家人轉(zhuǎn)賬,必須在你的賬戶里扣掉100塊,在家人賬戶里加上100塊,這兩筆操作需要一起完成,業(yè)務(wù)邏輯才是正確的。但是程序在做拆山修改的時(shí),肯定會(huì)有先后順序,試想一下程序扣了你的錢,這個(gè)時(shí)候程序崩潰了,家人賬戶的錢沒有加上。那這100塊是不是消失了?你是不是要發(fā)瘋?那么,就把這兩筆操作放進(jìn)一個(gè)事務(wù)里,通過原子性保證,這兩筆操作要么都成功,要么都失敗。這樣才能保證業(yè)務(wù)邏輯的正確性。
**一致性**,有很多文章講過一致性,但是很多人會(huì)把一致性跟原子性混在一起說(shuō)。事務(wù)的一致性指的是指每一個(gè)事務(wù)必須保證執(zhí)行之后所有庫(kù)內(nèi)的規(guī)則依舊成立。比如內(nèi)外鍵,constraint,觸發(fā)器等。舉例來(lái)說(shuō),你在儲(chǔ)蓄卡里有100元,理財(cái)賬戶里有100元,基金賬戶有100元,那么你在資產(chǎn)總和里會(huì)看到300元,這個(gè)300元必須是其他三個(gè)賬戶余額加在一起得到的。你在給家人轉(zhuǎn)帳100元是從儲(chǔ)蓄卡里轉(zhuǎn)出去了100元,那么在數(shù)據(jù)庫(kù)上可以通過創(chuàng)建觸發(fā)器的方式,當(dāng)儲(chǔ)蓄卡余額賬戶減100元的同時(shí),把資產(chǎn)總和也同步減去100,不然的話,就會(huì)出現(xiàn)邏輯上的錯(cuò)誤,因?yàn)槟阋呀?jīng)轉(zhuǎn)走了100塊儲(chǔ)蓄卡余額,實(shí)際資產(chǎn)總和應(yīng)該是200,如果還是300,數(shù)據(jù)庫(kù)狀態(tài)就不一致了。所以實(shí)現(xiàn)事務(wù)的時(shí)候,必須要保證相關(guān)聯(lián)的觸發(fā)器以及其他所有的內(nèi)部規(guī)則都執(zhí)行成功,事務(wù)才能算執(zhí)行成功。如果在減去資產(chǎn)總時(shí)出錯(cuò),那么這筆轉(zhuǎn)帳交易也不能成功。因?yàn)檫@樣數(shù)據(jù)庫(kù)就會(huì)進(jìn)入不一致的狀態(tài)。
那么這里跟原子性的區(qū)別到底在哪里呢?原子性是指?jìng)€(gè)多個(gè)用戶指令之間必須作為一個(gè)整體完成或失敗,而一致性更多是數(shù)據(jù)庫(kù)內(nèi)的相關(guān)數(shù)據(jù)規(guī)則必須世做同時(shí)完成或失敗。
**持久性**,最容易理解的一個(gè),事務(wù)只要提旅返中交了,那么對(duì)數(shù)據(jù)庫(kù)的修改就會(huì)保存下來(lái)不會(huì)丟了。簡(jiǎn)單來(lái)說(shuō),只要提交了,數(shù)據(jù)庫(kù)就算崩潰了,重啟之后你剛存的100塊依然在你的賬戶里。
**隔離性**,每個(gè)事務(wù)相對(duì)于其他的事務(wù)是有一定獨(dú)立性的,不能互相影響。因?yàn)閿?shù)據(jù)庫(kù)需要支持并發(fā)的操作來(lái)提高效率。在并發(fā)操作時(shí),一定要通過操作之間的隔離來(lái)保證業(yè)務(wù)邏輯的正確性。比如,你轉(zhuǎn)帳100塊給家人,一系列操作的最后一步可能是輸入驗(yàn)證碼,這個(gè)時(shí)候轉(zhuǎn)帳還沒有完成,但是在數(shù)據(jù)庫(kù)里你的賬戶對(duì)應(yīng)的記錄中已經(jīng)減去100塊,家人賬戶也加了100塊,就等著驗(yàn)證碼輸入以后,事務(wù)提交,完成操作。那么,這個(gè)時(shí)候,家人通過手機(jī)銀行能夠查到這100塊么?你的答案可能是不能,因?yàn)檫@樣才符合業(yè)務(wù)邏輯,因?yàn)槟愕霓D(zhuǎn)帳操作還沒有提交,事務(wù)還沒有完成。那么數(shù)據(jù)庫(kù)就應(yīng)該保證這兩個(gè)并發(fā)操作之間具有一定的隔離性。
那么到底應(yīng)該隔離到什么程度呢?隔離性又分為4個(gè)等級(jí):由低到高依次為Read uncommitted(讀未提交)、Read committed(讀提交)、Repeatable read(可重復(fù)讀?。?、Serializable(序列化),這四個(gè)級(jí)別可以逐個(gè)解決臟讀、不可重復(fù)讀、幻象讀這幾類問題。這些東西是什么意思?請(qǐng)有興趣的小伙伴自行百度,很多文章都寫的很清楚。
那么怎么理解不同的隔離等級(jí)呢,首先要理解并發(fā)操作,并發(fā)操作就是指有不同的用戶同時(shí)對(duì)一個(gè)數(shù)據(jù)進(jìn)行讀、寫操作,那么在這個(gè)過程中,每個(gè)用戶應(yīng)該看到什么數(shù)據(jù)才能保證業(yè)務(wù)邏輯的正確性呢? 如果是前面存取款的場(chǎng)景,我必須看到的是已經(jīng)存進(jìn)來(lái)的錢,也就是必須是已經(jīng)提交的事務(wù)。而12306刷火車票呢,你可以看到有10張余票,但是在下單的時(shí)候告訴你票賣完了,因?yàn)橥瑫r(shí)有10個(gè)用戶把票買掉了,你需要重新刷余票,這個(gè)也是可以接受的,也就是說(shuō)我可以讀到一些虛假的余票,這樣在業(yè)務(wù)上也沒有什么問題。那么在設(shè)計(jì)這兩個(gè)不同系統(tǒng)時(shí),就可以選擇不同的事務(wù)隔離級(jí)別來(lái)實(shí)現(xiàn)不同的并發(fā)效果。不同的隔離等級(jí)就是要在系統(tǒng)的并發(fā)性和數(shù)據(jù)邏輯的嚴(yán)謹(jǐn)性之間做出的平衡。
2. 數(shù)據(jù)庫(kù)如何實(shí)現(xiàn)事務(wù)
數(shù)據(jù)庫(kù)實(shí)現(xiàn)事務(wù)會(huì)有多種不同的方式,但基本的原理類似,比如都需要對(duì)事務(wù)進(jìn)行統(tǒng)一的編號(hào)處理,都需要記錄事務(wù)的狀態(tài)(是成功了還是失敗了),都需要在數(shù)據(jù)存儲(chǔ)的層面對(duì)事務(wù)進(jìn)行支持,以明確哪些數(shù)據(jù)是被哪些事務(wù)、插入、修改和刪除的。同時(shí)還會(huì)記錄事務(wù)日志等,對(duì)事務(wù)進(jìn)行系統(tǒng)化的管理以實(shí)現(xiàn)數(shù)據(jù)的原子性,一致性和持久性。
要實(shí)現(xiàn)事務(wù)的隔離性,最基礎(chǔ)的就是通過加鎖機(jī)制把并發(fā)操作適當(dāng)?shù)拇谢瘉?lái)保證數(shù)據(jù)操作的正確邏輯。但是為了要保證系統(tǒng)具有良好的并發(fā)性能,必須要在實(shí)現(xiàn)事務(wù)隔離性時(shí)需要找到合理的平衡點(diǎn)。大部分?jǐn)?shù)據(jù)庫(kù)(包括Oracle,MySQL,Postgres在內(nèi))在做并發(fā)控制的時(shí)候都會(huì)采用MVCC(多版本并發(fā)控制)的機(jī)制來(lái)保證系統(tǒng)具有較高的并發(fā)性,不同數(shù)據(jù)庫(kù)實(shí)現(xiàn)MVCC的具體方案也不盡相同,但其基本原理類似。
3. MVCC實(shí)現(xiàn)原理
所謂MVCC,就是數(shù)據(jù)庫(kù)中的同一查詢根據(jù)相關(guān)事務(wù)執(zhí)行的先后順序以及隔離級(jí)別的不同,可能會(huì)存在不同版本的結(jié)果,通過這樣的手段來(lái)保證大部分查詢操作不會(huì)被修改操作阻塞并保證數(shù)據(jù)邏輯的正確性。也就是數(shù)據(jù)庫(kù)通過保存多個(gè)版本的數(shù)據(jù)( 歷史 數(shù)據(jù))來(lái)提高系統(tǒng)的并發(fā)查詢能力。簡(jiǎn)單來(lái)說(shuō)就是用存儲(chǔ)空間來(lái)交換并發(fā)能力。下面以Postgres為例介紹一下MVCC的一種實(shí)現(xiàn)方式幫助大家理解這個(gè)重要的數(shù)據(jù)庫(kù)概念。通過下面的圖來(lái)解釋Posrgres里最基本的數(shù)據(jù)可見性是如何實(shí)現(xiàn)多版本控制的。
!(
,type_ZHJvaWRzYW5zZmFGJhY2s,shadow_50,text_Q1NETiBAd2luZHRhbGtlcnd5,size_20,color_FFFFFF,t_70,g_se,x_16)
首先,Postgres里的每一個(gè)事務(wù)都有編號(hào),這里可以簡(jiǎn)單理解為時(shí)間順序編號(hào),編號(hào)越大的事務(wù)發(fā)生越晚。然后,數(shù)據(jù)庫(kù)里的每一行記錄都會(huì)保存創(chuàng)建這條記錄的事務(wù)號(hào)(Cre),也會(huì)在記錄刪除時(shí)保存刪除這條記錄的事務(wù)號(hào)(Exp),換句話說(shuō),只要Exp這里一列里記錄了事務(wù)編號(hào),就說(shuō)明這條記錄被刪除了。那么一個(gè)事務(wù)應(yīng)該能看見那些記錄呢?Postgres里每一個(gè)事務(wù)都會(huì)保存一個(gè)當(dāng)前系統(tǒng)的事務(wù)快照(Snapshot),這個(gè)快照里會(huì)保存事務(wù)創(chuàng)建時(shí)當(dāng)前系統(tǒng)的更高(最晚)事務(wù)編號(hào),以及目前還在進(jìn)行中的事務(wù)編號(hào)。那么如上圖所示的一個(gè)事務(wù)的快照里更高事務(wù)編號(hào)為100,目前正在進(jìn)行的事務(wù)有25,50和75。那么對(duì)應(yīng)左邊數(shù)據(jù)記錄,這6行數(shù)據(jù)的可見性就如同標(biāo)注的一般:
之一行,Cre 30,沒有刪除,在100這個(gè)時(shí)間點(diǎn),應(yīng)該能看到。
第二行,Cre 50,沒有刪除,但是50這個(gè)事務(wù)還沒有提交,正在進(jìn)行中,所以看不見。
第三行,Cre 110,沒有刪除,但是100這個(gè)時(shí)間點(diǎn)110事務(wù)還沒有發(fā)生,所以看不見。
第四行,Cre 30,Exp 80,在80的時(shí)候數(shù)據(jù)被刪掉了,所以看不見。
第五行,Cre 30,Exp 75,在30的時(shí)候被創(chuàng)建,75時(shí)候被刪掉了,但是75這個(gè)事務(wù)在100的時(shí)候還沒有提交,所以這條記錄在100的時(shí)候還沒有刪掉,所以看得見。
第六行,Cre30,Exp 110,在30的時(shí)被創(chuàng)建,110時(shí)候被刪掉,但是在100時(shí)候,110還沒有發(fā)生,所以看得見。
綜上,就是這個(gè)事務(wù)對(duì)這六條記錄的可見性,也就是一個(gè)數(shù)據(jù)版本。那么大家可以看一下如果另一個(gè)事務(wù)的快照里存的是更高事務(wù)編號(hào)為110,正在進(jìn)行的事務(wù)為50,那么它能看到的數(shù)據(jù)應(yīng)該是哪幾行呢?同時(shí)大家也看到,Postgres里刪除一行數(shù)據(jù)其實(shí)就是在這一行的Exp這個(gè)列記錄一個(gè)刪除事務(wù)的編號(hào),相當(dāng)于做了一個(gè)刪除標(biāo)記,而數(shù)據(jù)沒有真正被刪除,因此Postgres數(shù)據(jù)庫(kù)需要定期做數(shù)據(jù)清理操作(Vacuum)。Pstgres的在現(xiàn)實(shí)場(chǎng)景里會(huì)比這里介紹的要復(fù)雜,因?yàn)槲覀冞@里假定所有的事務(wù)最終都是正確提交了,如果存在某些事務(wù)沒有提交的情況,那么可見性就會(huì)更加復(fù)雜,這里不再展開了。
關(guān)于postgres 刪除數(shù)據(jù)庫(kù)的介紹到此就結(jié)束了,不知道你從中找到你需要的信息了嗎 ?如果你還想了解更多這方面的信息,記得收藏關(guān)注本站。
創(chuàng)新互聯(lián)【028-86922220】值得信賴的成都網(wǎng)站建設(shè)公司。多年持續(xù)為眾多企業(yè)提供成都網(wǎng)站建設(shè),成都品牌建站設(shè)計(jì),成都高端網(wǎng)站制作開發(fā),SEO優(yōu)化排名推廣服務(wù),全網(wǎng)營(yíng)銷讓企業(yè)網(wǎng)站產(chǎn)生價(jià)值。
網(wǎng)站名稱:PostgreSQL數(shù)據(jù)庫(kù)刪除操作指南(postgres刪除數(shù)據(jù)庫(kù))
URL網(wǎng)址:http://fisionsoft.com.cn/article/coioigc.html


咨詢
建站咨詢
