是否有可能暫時(shí)禁用MySQL中的約束?
我有兩個(gè)Django模型,每個(gè)模型都有一個(gè)到另一個(gè)。 由于約束,刪除模型的實(shí)例會返回錯(cuò)誤:
cursor.execute("DELETE FROM WHERE n = %s", n)
() #a foreign key fails here
cursor.execute("DELETE FROM WHERE n = %s", n)
()
是否可以暫時(shí)禁用約束并刪除?
要么我沒有得到你想做的,要么你想要做的是非常,非常,非常丑陋。即使你能做到,你也許不應(yīng)該這樣做。
刪除并重新應(yīng)用FK正在改變您的數(shù)據(jù)庫。你試圖挑戰(zhàn)允許系統(tǒng)看到某種意義的限制因素,它并不認(rèn)為FK可能是一個(gè)暫時(shí)的東西,如果它確實(shí)知道,那就會引起恐慌。
你想做什么很奇怪。但是你使用的是哪個(gè)數(shù)據(jù)庫?
@:我正在使用MySQL。我將編輯我的問題以添加它。
如果您將其永久修改為ON DELETE SET NULL而不是禁用約束,該怎么辦?這將完成類似的事情,你不必打開和關(guān)閉鍵檢查。
@dnagirl:確實(shí)會更好。我怎樣才能做到這一點(diǎn)?
你應(yīng)該按照@dnagirl的要求去做。它的方式更合理,并且確保您不會以非常討厭的方式處理數(shù)據(jù)。像你想做的那樣玩它可能會導(dǎo)致嚴(yán)重的完整性和一致性問題。
試試DISABLE KEYS或
SET =0;
確保
SET =1;
后。
這是為mysql整體設(shè)置還是僅為該會話設(shè)置的東西?
我相信這是每次會議。
//8538636/…
//291100/… ,另請注意,Innodb不能disable keys
我可以為單個(gè)表禁用嗎?
@從閱讀中看,它似乎可以,但僅適用于單個(gè)會話。
要全局關(guān)閉外鍵約束,請執(zhí)行以下操作:
SET GLOBAL =0;
并記得在完成后將其設(shè)置回來
SET GLOBAL =1;
警告:只有在進(jìn)行單用戶模式維護(hù)時(shí)才應(yīng)執(zhí)行此操作。因?yàn)樗赡軐?dǎo)致數(shù)據(jù)不一致。例如,當(dāng)您使用輸出上載大量數(shù)據(jù)時(shí),它將非常有用。
這是我需要知道的,所以這不是很好的練習(xí),但這個(gè)家伙的回答應(yīng)該是得分更高......
在嘗試"最佳答案"后,這對我有用。也許可以添加對差異的解釋。
@hexnet區(qū)別在于只有SET 才會更改當(dāng)前連接的值,而SET GLOBAL ..會更改所有連接的值,包括將來的連接。如果你只是在一個(gè)窗口中執(zhí)行SET FOREIGN..,那么嘗試在不同的窗口(通過不同的連接)中應(yīng)用該語句,那里的值沒有改變。對于GLOBAL,兩個(gè)連接的相同變量具有相同的值。
回放更大的轉(zhuǎn)儲(6+ GB)
這對我不起作用。當(dāng)我嘗試時(shí),我看到:ERROR 1228 (HY000): '' is a SESSION and can't be used with SET GLOBAL
嘗試 @MikeB
@berniey沒有運(yùn)氣。不過沒關(guān)系。我使用alter語句暫時(shí)禁用外鍵約束。
@MikeB,我認(rèn)為它與您用來發(fā)出命令的工具有關(guān)(它與myqsl命令行工具一起使用)。我一直在v5.5和5.6上使用該命令,它工作正常。文檔建議甚至適用于v5.7。 /doc/refman/5.7/en/server-system-.html。此外,案件無關(guān)緊要(請?jiān)徫抑暗慕ㄗh)
請注意,如果連接到在發(fā)出全局查詢之前啟用了外鍵檢查的MySQL,則會保留外鍵檢查的當(dāng)前會話狀態(tài)。即SET GLOBAL =0; SELECT @@;將返回1,直到您重新連接以開始新會話
我通常只在我要截?cái)啾頃r(shí)才禁用外鍵約束,因?yàn)槲也粩嗷氐竭@個(gè)答案,這是為了將來我:
SET =0;
TABLE table;
SET =1;
不是禁用約束,而是永久地將其修改為ON DELETE SET NULL。這將完成類似的事情,你不必打開和關(guān)閉鍵檢查。像這樣:
請閱讀此內(nèi)容()和此內(nèi)容( /create-table-foreign-keys.html)。
注意更改表可能需要很長時(shí)間,最好將服務(wù)器全局設(shè)置為為0,并在臟工作完成后將其重新放回。除此之外它可能會鎖定寫表。
改變遠(yuǎn)程列類型時(shí)不會破壞引用嗎? (似乎我的客戶端將修改后的臨時(shí)表重命名為原始表名。)
要全局關(guān)閉外鍵約束:
SET GLOBAL = 0;
并用于活動外鍵約束
SET GLOBAL = 1;
的一個(gè)非常簡單的解決方案:
在表格中,轉(zhuǎn)到SQL選項(xiàng)卡
編輯要運(yùn)行的SQL命令后,GO旁邊會出現(xiàn)一個(gè)復(fù)選框,名為"啟用外鍵檢查"。
取消選中此復(fù)選框并運(yùn)行SQL。它將在執(zhí)行后自動重新檢查。
謝謝!確實(shí),解決方案SET =0; ..... SET =1;在中對我不起作用,因?yàn)槲彝巳∠x中"啟用外鍵檢查"復(fù)選框。在中,您可以跳過這些SET命令,只需取消選中該復(fù)選框即可。
如果鍵字段可以為空,那么您也可以在嘗試刪除它之前將該值設(shè)置為null:
cursor.execute("UPDATE SET = NULL WHERE n = %s", n)
()
cursor.execute("UPDATE SET = NULL WHERE n = %s", n)
()
cursor.execute("DELETE FROM WHERE n = %s", n)
()
cursor.execute("DELETE FROM WHERE n = %s", n)
()
對我來說,SET =0;還不夠。
我還有一個(gè)com.mysql.jdbc..jdbc4.on。
我不得不添加ALTER TABLE myTable DISABLE KEYS;。
所以:
SET =0;
ALTER TABLE myTable DISABLE KEYS;
DELETE FROM myTable;
ALTER TABLE myTable ENABLE KEYS;
SET =1;
僅供參考,mySQL 5.7拋出警告,運(yùn)行DISABLE KEYS命令時(shí)InnoDB引擎沒有此選項(xiàng)。
這確實(shí)有效,沒有改變表它也不適合我
在中,您可以選擇多行,然后單擊刪除操作。您將進(jìn)入一個(gè)列出刪除查詢的屏幕,您可以取消選中外鍵檢查,然后單擊是以執(zhí)行它們。
即使存在ON DELETE限制約束,這也可以刪除行。
將外鍵約束設(shè)置為0并不是一個(gè)好主意,因?yàn)槿绻@樣做,您的數(shù)據(jù)庫將無法確保它不會違反參照完整性。這可能會導(dǎo)致數(shù)據(jù)不準(zhǔn)確,誤導(dǎo)或不完整。
您出于某種原因創(chuàng)建外鍵:因?yàn)樽恿兄械乃兄刀紤?yīng)與父列中的值相同。如果沒有外鍵約束,子行可以具有不在父行中的值,這將導(dǎo)致不準(zhǔn)確的數(shù)據(jù)。
例如,假設(shè)您有一個(gè)供學(xué)生登錄的網(wǎng)站,每個(gè)學(xué)生都必須以用戶身份注冊帳戶。您有一個(gè)用戶ID表,用戶ID作為主鍵;和另一個(gè)學(xué)生帳戶表,學(xué)生ID為專欄。由于每個(gè)學(xué)生都必須擁有用戶ID,因此從學(xué)生帳戶表中將學(xué)生ID作為引用用戶ID表中的主鍵用戶ID的外鍵是有意義的。如果沒有外鍵檢查,學(xué)生可能最終擁有學(xué)生ID而沒有用戶ID,這意味著學(xué)生可以在不是用戶的情況下獲得帳戶,這是錯(cuò)誤的。
想象一下,如果它發(fā)生在大量數(shù)據(jù)上。這就是你需要外鍵檢查的原因。
最好找出導(dǎo)致錯(cuò)誤的原因。您很可能嘗試從父行刪除而不從子行中刪除。在從父行刪除之前嘗試從子行中刪除。
沒錯(cuò),總會有一個(gè)權(quán)衡。
沒人說要永遠(yuǎn)這樣運(yùn)行它。您關(guān)閉約束,批量加載某些數(shù)據(jù),然后重新打開它。沒什么大不了的,人們總是這樣做。
對于批量進(jìn)口是必要的,至少對于性能來說,它是非常普遍的。有時(shí)您只需要恢復(fù)數(shù)據(jù),然后您可以進(jìn)行檢查。
這不是問題的答案。
請注意,他的問題是暫時(shí)如何做到這一點(diǎn)。執(zhí)行某些維護(hù)和數(shù)據(jù)導(dǎo)入時(shí)需要這樣做。需要注意的是,導(dǎo)入腳本會對數(shù)據(jù)完整性負(fù)責(zé)。然后,稍后當(dāng)重新打開索引和約束時(shí),db將告訴您某些內(nèi)容是否已損壞。
你有沒有用過?
在access中如何創(chuàng)建復(fù)雜報(bào)表
access中的報(bào)表是一個(gè)按指定格式顯示打印輸出數(shù)據(jù)的數(shù)據(jù)庫對象,報(bào)表可以對數(shù) 據(jù)進(jìn)行分組計(jì)算匯總和打印輸出等操作。報(bào)表有四種視圖:
1:報(bào)表視圖:顯示報(bào)表的實(shí)際效果。
2:打印報(bào)表視圖:顯示報(bào)表的分頁打印效果,可以放大或縮小
3:布局視圖:顯示報(bào)表的實(shí)際效果,可直接進(jìn)行修改
4:設(shè)計(jì)視圖:創(chuàng)建和編輯報(bào)表的結(jié)構(gòu)
現(xiàn)在來看一看怎么創(chuàng)建復(fù)雜報(bào)表吧!
工具/原料
方法/步驟
步驟一:在桌面上雙擊access圖標(biāo),進(jìn)入access軟件編輯視圖。
步驟二:進(jìn)入之后選擇你所須要的數(shù)據(jù)庫,然后進(jìn)入編輯頁面選擇創(chuàng)建選項(xiàng)卡你現(xiàn)在可以在這個(gè)功能組里面選擇你想要創(chuàng)建的報(bào)表類型,同時(shí)在創(chuàng)建選項(xiàng)卡里面你也可以創(chuàng)建查詢、窗體、還有宏和類模塊
步驟三:選擇設(shè)計(jì)選項(xiàng)卡下面的“添加現(xiàn)有字段”然后在窗口的右邊會出現(xiàn)一個(gè)字段列表的浮動框,在這個(gè)里面你可以選擇你所需要的數(shù)據(jù)表,然后單擊選中拖動到編輯區(qū)域或者雙擊自動添加到編輯區(qū)域,
步驟四:選中你所要排列的字段,接下來你可以在“排列”選項(xiàng)卡下選擇表格功能組,里面有一個(gè)“表格”命令單擊一下,你選中的字段就會有序的排列好 :樣式如下圖
步驟五:下面你可以為你得報(bào)表添加一些邊框,你現(xiàn)在須要選擇“設(shè)計(jì)”選項(xiàng)卡下的“工具組”下的“屬性表”你可以在屬性表里面設(shè)置他的各種屬性,現(xiàn)在選擇“全部”選項(xiàng)卡“下面有:邊框樣式,邊框?qū)挾龋吙蝾伾吞厥庑Ч?/p>
步驟六:如果你想要設(shè)置你的時(shí)間或者日期,你可以在”設(shè)計(jì)“選項(xiàng)卡下”選擇“日期和時(shí)間”命令,想要設(shè)置你的“標(biāo)題”也可以在這里面設(shè)計(jì)
步驟七:最后的效果如下圖,想要設(shè)置一些匯總或者排序你可以在"設(shè)計(jì)"選項(xiàng)卡下選擇分組和排序命令在里面可以設(shè)置你的排序字段和匯總字段,這里就不多加贅述
END
經(jīng)驗(yàn)內(nèi)容僅供參考,如果您需解決具體問題(尤其法律、醫(yī)學(xué)等領(lǐng)域),建議您詳細(xì)咨詢相關(guān)領(lǐng)域?qū)I(yè)人士。
*請認(rèn)真填寫需求信息,我們會在24小時(shí)內(nèi)與您取得聯(lián)系。