web-dev-qa-db-ja.com

制約の名前がわからない場合、Oracleで「not null」制約を削除するにはどうすればよいですか?

フィールドに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の専門知識が不足しているので)システム生成名を持つ可能性のある制約がそれを削除する方法に関連付けられていることは普遍的に真実ではないかもしれないと心配していますその名前を知らなくても制約。制約を論理的に削除するときに、システム名のある制約の名前を知る必要を回避する方法が常にあるというのは本当ですか?

77
Chris Farmer
alter table MYTABLE modify (MYCOLUMN null);

Oracleでは、列に非NULLが指定されている場合、非NULL制約が自動的に作成されます。同様に、列が変更されてヌルが許可されると、自動的にドロップされます。

修正された質問の明確化:このソリューションは、「nullではない」列に対して作成された制約にのみ適用されます。列の定義で名前を付けずに「主キー」またはチェック制約を指定すると、システム生成の制約名(および主キーのインデックス)になります。そのような場合、ドロップする名前を知る必要があります。最善のアドバイスは、「not null」以外のすべての制約に名前を指定して、シナリオを回避することです。これらの制約のいずれかを一般的に削除する必要がある状況にある場合は、おそらくPL/SQLとデータ定義テーブルに頼る必要があります。

152
Allan

試してください:

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

Nullを許可するフィールドが主キーの一部である場合、できないことを覚えておいてください。主キーにnullフィールドを含めることはできません。

1
Mary C

使用されている制約を見つけるには、次のコードを使用します。

-- 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;

これは基本的に、参照先テーブルの作成方法に関する作成ステートメントを示しています。テーブルの作成方法を知ることで、すべてのテーブル制約を確認できます。

Michael McLaughlinのブログからの回答: http://michaelmclaughlin.info/db1/lesson-5-querying-data/lab-5-querying-data/ 彼のDatabase Design Iクラスから。

1
Guentersniden

異なる値を許可するために更新する必要があるカスタムチェック制約を回避しようとして、同じ問題に直面していました。問題は、ALL_CONSTRAINTSには、制約が適用されている列を特定する方法がないことです。私がそれをどうにかしてやったのは、代わりにALL_CONS_COLUMNSをクエリし、名前ごとに各制約を削除して再作成することです。

table_name = [TABLE_NAME]およびcolumn_name = [COLUMN_NAME]のall_cons_columnsからconstraint_nameを選択します。

0
CaduMaciel