2

変更キー (NOT NULL + UNIQUE) のアウトライン制約を作成したかったのですが、NOT NULL 制約をアウトラインに配置できないと思うので、オプションが必要だと思います:

  • アウトラインの制約:CHECK(attr IS NOT NULL)
  • インライン拘束NOT NULL+アウトライン拘束UNIQUE(attr)

NOT NULLインライン制約を列に設定することと制約を追加することに違いはありますCHECK (column IS NOT NULL)か?

前もって感謝します

4

3 に答える 3

6

NOT NULL推奨されるアプローチとして列を定義します。これは、、、、DBA_TAB_COLSおよびALL_TAB_COLSデータUSER_TAB_COLSディクショナリビューで、たとえば、列がではないことを示しますNULLABLENOT NULLこれは従来のアプローチでもあるため、将来の開発者は、制約が定義できない列に制約が定義されることを期待する可能性がはるかに高くなりますNULL

制約を作成するのではなく、UNIQUE制約とともに制約を定義できるのと同じように、制約ではなく制約を定義できます。どちらのアプローチも、機能的な観点からは同じように機能します。ただし、データディクショナリビューではこれらのアプローチの表示が異なるため、データディクショナリに依存するツールの動作はわずかに異なる場合があります。そして、従来のアプローチは、将来の開発者が驚かされるよりも、見て期待するものである可能性がはるかに高くなります。NOT NULLPRIMARY KEYCHECKNOT NULL

于 2012-03-11T13:05:38.270 に答える
2

ここの Oracle ページにいくつかの情報があります

オラクルは次のように述べています。

于 2013-04-23T07:52:05.043 に答える
1

はい、大きな違いがあります - オプティマイザーはそれらを異なる方法で扱います。通常、列レベルでの NOT NULL は、この観点から望ましいものです (実行計画が向上する可能性があります)。

ところで、Jeffrey Kemp のコメントについては、「NOT NULL は、削除するために制約名を知る必要がない唯一の制約タイプです」 - このステートメントは間違っています。主キーは、名前を知らなくても削除される可能性があります。

create table x(xx number primary key, yy number);
alter table x drop primary key;
alter table x modify xx unique;
alter table x drop unique(xx);
alter table x add unique(xx,yy);
alter table x drop unique(xx,yy);
于 2014-01-15T09:32:31.250 に答える