2017-07-11 15 views
0

テーブルの列にNULL値が1つしかないことを保証する整合性の制約を作成する必要があります。古典的なUNIQUEは、複数のヌルを検出しないのでうまくいかない... どうすればよいですか?null値の制約固有列を追加する

+0

任意のビジネスロジックやインターフェースがユニークな 'データなし' の値の代わりにヌルを使用してからあなたを防ぐのか? –

+0

問題は試験の練習の制約であるため、設計選択をすることができません。 –

答えて

3
CREATE TABLE qwe(
    id int 
); 

CREATE UNIQUE INDEX qwe_idx ON qwe( 
     CASE WHEN id IS null THEN 'NULL' ELSE to_char(id) END 
); 

INSERT INTO qwe VALUES(1); 
1 row inserted. 

INSERT INTO qwe VALUES(1); 
Error starting at line : 9 in command - 
INSERT INTO qwe VALUES(1) 
Error report - 
ORA-00001: naruszono więzy unikatowe (TEST.QWE_IDX) 

INSERT INTO qwe VALUES(NULL); 
1 row inserted. 

INSERT INTO qwe VALUES(NULL); 
Error starting at line : 9 in command - 
INSERT INTO qwe VALUES(NULL) 
Error report - 
ORA-00001: naruszono więzy unikatowe (TEST.QWE_IDX) 

SELECT * FROM qwe; 

     ID 
---------- 
     1 
    (null) 
+1

IDのような列(NUMBERデータ型)で動作します。列がVARCHAR2列の場合、列の有効な値である可能性があるため、文字列 'NULL'との比較は機能しない可能性があります。ただし、小さな変更は機能します。たとえば、列の値の最後にスペースを連結するための一意の制約を作成します。 (これは、Oracleが標準に従ってNULLを処理した場合には機能しませんが、そうではありません) – mathguy

+1

string(varchar2)カラムの@mathguyも非常に簡単です。 NULL THEN 1 END) ' – krokodilko

+1

解決策は不正です.1はVARCHAR2にキャストされ、列の有効な値(文字列 '1')と衝突する可能性があります。私は既に私のコメントの中で正しい解決策(列の有効な値と無効な値の事前知識に依存していない)を1つ説明しました。 – mathguy

関連する問題