Oracle 10g には、TEMP_TABLE2 つの列だけで名前が付けられたテーブルが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 つ作成します。DESCRIPTIONTEMP_TABLE
ここで、次のSELECTコマンドを発行すると、
SELECT * FROM temp_table WHERE description IS NULL;
次に、一方の列に値があり、もう一方の列にnull空の文字列がある行の両方をフェッチします。''DESCRIPTION
ただし、次のSELECTステートメントは、TEMP_TABLE
SELECT * FROM temp_table WHERE description='';
列に空の文字列がある行も取得しませんDESCRIPTION。
おそらく、ここでは Oracle がnull値と空の文字列を異なる方法で処理しているように見えますが、値と空の文字列の両方が制約付きの列に挿入されないようにするステートメントに''は当てはまらないようです。なぜそうなのですか?INSERTnull''not null