83

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

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
4

4 に答える 4

137

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

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

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

于 2011-02-22T14:39:17.253 に答える
12

最初に新しい制約を作成してから、古い制約を削除します。
そうすれば、次のことが保証されます。

  • 制約は常に存在する
  • 既存の行は新しい制約に違反していません
  • 制約を削除した後、新しい制約が適用される前に、不正な INSERT/UPDATE が試行されることはありません。
于 2017-06-01T08:02:06.547 に答える
2

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

于 2011-02-22T12:02:13.450 に答える
0

いいえ。そのような機能が存在する場合は、この構文図に記載されています。(文書化されていない SQL 機能が存在する可能性はありますが、私が認識していないパッケージが存在する可能性もあります。)

于 2011-02-23T01:11:44.347 に答える