plsql constraint用法 - 當我不知道約束的名稱時,如何在Oracle中刪除“not null”約束?




check add (5)

我有一個數據庫,在字段上有一個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的專業知識),任何可能具有系統生成名稱的約束都可能與其相關聯,這可能並不普遍。約束而不必知道它的名字。 在邏輯上刪除該約束時,總會有一種方法可以避免必須知道系統命名約束的名稱嗎?


Answers

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


嘗試:

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

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

-- 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/http://michaelmclaughlin.info/db1/lesson-5-querying-data/lab-5-querying-data/來自他的數據庫設計I課程。


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

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


insert into OPT       (email,        campaign_id) 
select '[email protected]' as email, 100 as campaign_id from dual MINUS
select                 email,        campaign_id from OPT;

如果在OPT中已經有一個[email protected] / 100的記錄,則MINUS將從select '[email protected]' as email, 100 as campaign_id from dual此記錄select '[email protected]' as email, 100 as campaign_id from dual記錄的select '[email protected]' as email, 100 as campaign_id from dual並且不會插入任何內容。 另一方面,如果沒有這樣的記錄, MINUS不會減去任何內容,並且將插入值[email protected] / 100的值。

正如p.marino已經指出的那樣, merge可能是針對您的問題的更好(更正確)的解決方案,因為它專門用於解決您的任務。





oracle plsql constraints