web-dev-qa-db-ja.com

既存のチェック制約を変更する方法は?

テーブルの既存のチェック制約を変更する方法はありますか?削除して再作成する以外に

create table t ( n number);
ora10g> Tabelle wurde erstellt.

ora10g> alter table t add constraint ck check(n>0);

Tabelle wurde geõndert.

ora10g> alter table t modify constraint ck check(n<0);
alter table t modify constraint ck check(n<0)
                                   *
FEHLER in Zeile 1:
ORA-00933: SQL-Befehl wurde nicht korrekt beendet
64
schurik

削除して再作成する必要がありますが、必要ない場合はデータの再検証のコストを負担する必要はありません。

alter table t drop constraint ck ;
alter table t add constraint ck check (n < 0) enable novalidate;

enable novalidate句は、挿入または更新によって制約を強制しますが、すべての行が準拠していることを確認するためにテーブルに対してテーブル全体のスキャンを強制しません。

113
Adam Musch

最初に新しい制約を作成してから、古い制約を削除します。
そのようにして、次のことを確認します。

  • 制約は常に適切です
  • 既存の行は新しい制約に違反しません
  • 制約を削除した後、新しい制約が適用される前に、不正なINSERT/UPDATEは試行されません。
3
Witold Kaczurba

いいえ、それ以外の方法ではできません。

2
Oleg Danu

いいえ。そのような機能が存在する場合、この 構文図 にリストされます。 (文書化されていないSQL機能がある可能性はありますが、おそらく知らないパッケージがあるかもしれません。)

0
Jon Heller