Oracle 10g には、TEMP_TABLE
2 つの列だけで名前が付けられたテーブルがid
ありますdescription
。これは、デモンストレーションのためだけです。
列id
はタイプのシーケンス生成主キーでNUMBER(35, 0) not null
あり、列DESCRIPTION
のタイプはVARCHAR2(4000) not null
です。
この場合の基本的なテーブル構造は次のようになります。
+--------------+-----------+---------------+
|Name | Null? | Type |
+--------------+-----------+---------------+
|ID | NOT NULL | NUMBER(35) |
|DESCRIPTION | NOT NULL | VARCHAR2(4000)|
+--------------+-----------+---------------+
INSERT
このテーブルを作成した後、代わりに次のコマンドを挿入しようとしています。
INSERT INTO temp_table (id, description) VALUES (1, null); ->unsuccessful
INSERT INTO temp_table (id, description) VALUES (2, ''); ->unsuccessful
not null
列に制約が適用されているため、どちらも明らかに失敗していDESCRIPTION
ます。
どちらの場合も、オラクルは文句を言います
ORA-01400: cannot insert NULL into ("WAGAFASHIONDB"."TEMP_TABLE"."DESCRIPTION")
NULL
空の文字列は、Oracle では値として扱われます。
not null
列の制約を削除した場合DESCRIPTION
、基本的なテーブル構造は次のようになります
+--------------+-----------+---------------+
|Name | Null? | Type |
+--------------+-----------+---------------+
|ID | NOT NULL | NUMBER(35) |
|DESCRIPTION | | VARCHAR2(4000)|
+--------------+-----------+---------------+
指定された両方のINSERT
コマンドが成功します。null
の列に値を含む行と空の文字列を含む行''
を2 つ作成します。DESCRIPTION
TEMP_TABLE
ここで、次のSELECT
コマンドを発行すると、
SELECT * FROM temp_table WHERE description IS NULL;
次に、一方の列に値があり、もう一方の列にnull
空の文字列がある行の両方をフェッチします。''
DESCRIPTION
ただし、次のSELECT
ステートメントは、TEMP_TABLE
SELECT * FROM temp_table WHERE description='';
列に空の文字列がある行も取得しませんDESCRIPTION
。
おそらく、ここでは Oracle がnull
値と空の文字列を異なる方法で処理しているように見えますが、値と空の文字列の両方が制約付きの列に挿入されないようにするステートメントに''
は当てはまらないようです。なぜそうなのですか?INSERT
null
''
not null