2017-03-08 4 views
0

Oracle表に制約を追加する必要があります。数値列はゼロまたは一意でなければなりません(および> 0)。 制約定義または関数内にクエリを挿入しようとしましたが、許可されていません。 Greetings、Marcelo。Oracleチェック制約列がゼロまたは一意である

+0

あなたは私たちにチェック制約をどのように表示できますか?私たちに挿入物を見せてくれる?テーブルのDDLはプラスになります – Moudiz

+0

なぜゼロですか?この制約はどのようなビジネスルールを実施しようとしていますか? – APC

+0

重複のようです。 http://stackoverflow.com/questions/42671008/how-do-i-add-a-not-null-column-and-a-check-constraint-in-one-line-in-oracle-11gそれはあなたのようですguyzは一緒に働いています – XING

答えて

1

私があなたのニーズを十分に理解している場合は、関数ベースのインデックスを使用して、正の値のみの一意性をチェックできます。例えば

:異なる値を挿入する

SQL> create table checkUniqueTab(n number); 

Table created. 

SQL> create unique index i1 on checkUniqueTab(case when n > 0 then n end); 

Index created. 

は仕事:私は0で多くの行を挿入することができます

SQL> insert into checkUniqueTab values (1); 
insert into checkUniqueTab values (1) 
* 
ERROR at line 1: 
ORA-00001: unique constraint (ALEK.I1) violated 

:ここ

SQL> insert into checkUniqueTab values (1); 

1 row created. 

SQL> insert into checkUniqueTab values (2); 

1 row created. 

は私が重複正の値を挿入しよう値:

SQL> insert into checkUniqueTab values (0); 

1 row created. 

SQL> insert into checkUniqueTab values (0); 

1 row created. 

結果:

SQL> select * from checkUniqueTab; 

     N 
---------- 
     1 
     2 
     0 
     0 

これは、あなたがすでに負の値を挿入防ぐために、あなたのテーブルの上に制約があることを前提としています。

+0

これは非常にきちんとした解決策ですが、重複した負の値も許可します。だから、 '(n> = 0)'を強制するためにチェック制約が必要だと思う。 – APC

+0

それは私が望んでいたものです!ありがとうございました! –

+0

@APC:そうです。そのような制約がすでにテーブルに存在していると仮定していましたが、明確にする方が良いです。編集に行く – Aleksej

関連する問題