我有一個數據庫在一個字段上有一個NOT NULL約束,我想刪除這個約束。複雜的因素是這個約束具有一個系統定義的名稱,並且該約束的名稱在生產服務器,集成服務器和各種開發人員數據庫中不同。我們目前的過程是檢查變更腳本,並且一個自動化任務通過sqlplus針對目標數據庫執行適當的查詢,所以我更喜歡可以直接發送到sqlplus的解決方案。當我不知道約束的名稱時,如何在Oracle中刪除「非空」約束?
在我自己的數據庫,要刪除SQL,這將是:
alter table MYTABLE drop constraint SYS_C0044566
我能看到的約束,當我查詢all_constraints
觀點:
select * from all_constraints where table_name = 'MYTABLE'
,但我不知道如何使用SEARCH_CONDITION
的LONG
數據類型,或者即使知道其名稱後如何最好地動態刪除查找的約束。
那麼,如何創建一個可以基於它是什麼來放棄這個約束的變更腳本,而不是它的名字是什麼?
編輯: @艾倫的回答是一個很好的,但我擔心(我缺乏甲骨文的專業知識),它可能不是普遍適用的是,可能有一個系統生成的名稱的任何約束將有與之相關聯的一種方法可以在不必知道名稱的情況下刪除約束。是否真的總是有一種方法可以避免在邏輯上刪除該約束時知道系統命名約束的名稱?
只是爲了滿足您的好奇心:NOT NULL約束是Oracle中的* only *約束類型,您可以在不需要知道約束名稱的情況下移除它。所有其他約束類型您需要知道約束的名稱。 – 2012-06-11 06:21:04