1. ホーム
  2. oracle

[解決済み] Oracleの "not null "制約の名前がわからない場合、どのようにドロップすればよいですか?

2023-03-12 09:39:53

質問

あるフィールドに NOT NULL 制約が設定されているデータベースがあり、この制約を削除したいのです。 複雑な要因は、この制約がシステム定義の名前を持っており、その制約の名前が本番サーバー、統合サーバー、およびさまざまな開発者データベースの間で異なっていることです。 私たちの現在のプロセスは、変更スクリプトをチェックインし、自動タスクがターゲットデータベースに対して sqlplus を介して適切なクエリを実行することであり、私は単に sqlplus に直接送信できるようなソリューションを希望します。

私自身のデータベース上で、これをドロップする SQL は次のようになります。

alter table MYTABLE drop constraint SYS_C0044566

をクエリすると、制約が見えるようになります。 all_constraints ビューにクエリすると制約が表示されます。

select * from all_constraints where table_name = 'MYTABLE'

をどのように扱えばよいのかがわかりません。 SEARCH_CONDITION 's LONG のデータ型を削除するか、またはその名前を知った後でも、検索された制約を動的に削除する最善の方法です。

では、名前ではなく、この制約が何であるかに基づいて、この制約を削除できる変更スクリプトを作成するにはどうすればよいでしょうか。


EDITです。 Allan の回答は良いものですが、(Oracle の専門知識がないため)、システムが生成した名前を持つ可能性のあるすべての制約に、その名前を知らなくても制約を削除する方法が関連付けられているということが普遍的に正しいとは限らないのではないかという懸念があります。 論理的に制約を削除するときに、システムで名付けられた制約の名前を知る必要がない方法が常にあるというのは本当でしょうか?

どのように解決するのですか?

alter table MYTABLE modify (MYCOLUMN null);

Oracleでは、Not null制約がカラムに指定されると、自動的に作成されます。 同様に、列が NULL を許可するように変更された場合、それらは自動的に削除されます。

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