0

表 1
ID - 名前 - メイン番号 - ランダム 1 - ランダム 2
1* - aaaa -blalablabla* - * ** - *
2
- vvvv -blublubluuu* - * ** - *
3
- aaaa -blalablabla* - * ** - **


ID 、名前、およびメイン番号は主キー
です列名とメイン番号に重複した値があることに気付いたという私の問題、他の重複した値を追加したくない(実際のテーブルには多くの値があるため、古い重複を保持する必要があります重複したデータとそれらを削除するのが難しい)
挿入しようとしているこの名前が重複していることを確認するために(コミットする前に)試したときに欲しいもの。
プロシージャまたはトリガーでそれを行うことができますが、制約チェックの方が簡単で簡単だと聞いたことがあります(より簡単な方法があれば、プロシージャまたはトリガーは喜んでそれを学びます)

CONSTRAINT check_name
CHECK (名前 = (A_name))

制約はそのような方法で複数の列を持つことができますか?

CONSTRAINT check_name
CHECK (name = (A_name) , main_number=( A_number))

そのような方法で制約を書くことはできますか?

CONSTRAINT check_name
CHECK (名前 = (列名と同じ値を持つ列がある場合を選択))

だから私の質問:重複する列があるかどうか、またはトリガーを使用する必要があるかどうかを知るのに役立つ、制約をチェックする方法はありますか?

4

3 に答える 3

3

データベースは Oracle であるため、NOVALIDATE 制約も使用できます。意味: 「データがどうであれ、これから検証するだけです」。

  create table tb1 
  (field1 number);

  insert into tb1 values (1);
  insert into tb1 values (1);
  insert into tb1 values (1);
  insert into tb1 values (2);
  insert into tb1 values (2);
  commit;

  -- There should be an non-unique index first
  create index idx_t1 on tb1 (field1);

  alter table tb1 add constraint pk_t1 primary key(field1) novalidate;

  -- If you try to insert another 1 or 2 you would get an error
  insert into tb1 values (1);
于 2013-05-28T15:45:32.113 に答える
0

はい、多くの列で制約を使用できます。

ただし、この場合、すべてのテーブル行が制約を満たす必要があるため、制約は適用されません。トリガーを使用します。

制約にサブクエリを含めることはできません。

または、一意の制約を適用する一意のインデックスを使用します

create unique index index1 on table1 
     (case when ID <= XXX then null else ID end,
      case when ID <= XXX then null else name end);

「XXX」を現在の max(ID) に置き換えます。

于 2013-05-28T11:56:09.747 に答える