2010-03-29 93 views
62

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

在我自己的數據庫,要刪除SQL,這將是:

alter table MYTABLE drop constraint SYS_C0044566 

我能看到的約束,當我查詢all_constraints觀點:

select * from all_constraints where table_name = 'MYTABLE' 

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

那麼,如何創建一個可以基於它是什麼來放棄這個約束的變更腳本,而不是它的名字是什麼?


編輯: @艾倫的回答是一個很好的,但我擔心(我缺乏甲骨文的專業知識),它可能不是普遍適用的是,可能有一個系統生成的名稱的任何約束將有與之相關聯的一種方法可以在不必知道名稱的情況下刪除約束。是否真的總是有一種方法可以避免在邏輯上刪除該約束時知道系統命名約束的名稱?

+3

只是爲了滿足您的好奇心:NOT NULL約束是Oracle中的* only *約束類型,您可以在不需要知道約束名稱的情況下移除它。所有其他約束類型您需要知道約束的名稱。 – 2012-06-11 06:21:04

回答

132
alter table MYTABLE modify (MYCOLUMN null); 

在Oracle中,當爲列指定非空​​值時,不會自動創建空約束。同樣,當列更改爲允許空值時,它們會自動丟棄。

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

+0

這似乎真的太好了,但它確實處理我目前的情況,並且很簡單!在oracle中是否有任何情況下,約束名稱可能是系統生成的,但無法寫入sql來避免這樣的約束名稱? – 2010-03-29 19:27:57

+1

謝謝......事實證明'not null'約束是我的模式中唯一的系統命名約束,可能會以這種方式影響我。 – 2010-03-29 19:43:19

14

嘗試:

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

它的工作原理。謝謝 – 2015-02-16 12:23:01

1

只要記住,如果你想爲空的領域是主鍵的一部分,你不能。主鍵不能有空字段。

0

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

選擇constraint_name命令 從ALL_CONS_COLUMNS 在表格名= [TABLE_NAME] 和列名= [COLUMN_NAME];

1

要發現使用任何約束,使用下面的代碼:

-- Set the long data type for display purposes to 500000. 

SET LONG 500000 

-- Define a session scope variable. 

VARIABLE output CLOB 

-- Query the table definition through the <code>DBMS_METADATA</code> package. 

SELECT dbms_metadata.get_ddl('TABLE','[Table Described]') INTO :output FROM dual; 

這實質上顯示了被引用的表是如何製造一個create語句。通過了解如何創建表,您可以看到所有表約束。

回答採納自Michael McLaughlin的博客:http://michaelmclaughlin.info/db1/lesson-5-querying-data/lab-5-querying-data/從他的數據庫設計I類。