foreign - oracle constraint用法




當我不知道約束的名稱時,如何在Oracle中刪除“not null”約束? (4)

我有一個數據庫,在字段上有一個NOT NULL約束,我想刪除這個約束。 複雜因素是此約束具有系統定義的名稱,並且該約束的名稱在生產服務器,集成服務器和各種開發人員數據庫之間不同。 我們當前的流程是檢入更改腳本,並且自動化任務通過sqlplus對目標數據庫執行適當的查詢,因此我更喜歡可以直接發送到sqlplus的解決方案。

在我自己的數據庫中,刪除它的SQL將是:

alter table MYTABLE drop constraint SYS_C0044566

當我查詢all_constraints視圖時,我可以看到約束:

select * from all_constraints where table_name = 'MYTABLE'

但我不知道如何使用SEARCH_CONDITIONLONG數據類型,或者即使在我知道其名稱後如何最好地動態刪除查找的約束。

那麼,我如何創建一個更改腳本,可以根據它的內容而不是它的名稱來刪除這個約束?

編輯:@ Allan的答案是一個很好的答案,但我擔心(由於我缺乏Oracle的專業知識),任何可能具有系統生成名稱的約束都可能與其相關聯,這可能並不普遍。約束而不必知道它的名字。 在邏輯上刪除該約束時,總會有一種方法可以避免必須知道系統命名約束的名稱嗎?


嘗試:

alter table <your table> modify <column name> null;

我遇到了同樣的問題,試圖解決我需要更新以允許不同值的自定義檢查約束。 問題是ALL_CONSTRAINTS沒有辦法告訴哪個列應用了約束。 我設法做到的方法是通過查詢ALL_CONS_COLUMNS,然後按名稱刪除每個約束並重新創建它。

從all_cons_columns中選擇constraint_name,其中table_name = [TABLE_NAME]和column_name = [COLUMN_NAME];


請記住,如果要使其成為可空的字段是主鍵的一部分,則不能。 主鍵不能包含空字段。


alter table MYTABLE modify (MYCOLUMN null);

在Oracle中,如果未為列指定null,則會自動創建非空約束。 同樣,當列更改為允許空值時,它們會自動刪除。

澄清修訂後的問題 :此解決方案僅適用於為“非空”列創建的約束。 如果在未定義命名的情況下在列定義中指定“主鍵”或檢查約束,則最終將為約束(以及主鍵的索引)生成系統生成的名稱。 在這些情況下,您需要知道刪除它的名稱。 最好的建議是通過確保為除“not null”之外的所有約束指定名稱來避免該場景。 如果您發現自己需要一般地放棄其中一個約束,那麼您可能需要求助於PL / SQL和數據定義表。





constraints