thể trùng lặp:
Why does Oracle 9i treat an empty string as NULL?rỗng vs chuỗi rỗng trong Oracle
Tôi có một bảng trong Oracle 10g tên TEMP_TABLE
với chỉ có hai cột - id
và description
chỉ vì lợi ích của cuộc biểu tình .
Cột id
là chuỗi khóa được tạo thứ tự của loại NUMBER(35, 0) not null
và cột DESCRIPTION
là một loại VARCHAR2(4000) not null
.
Cấu trúc bảng cơ bản trong trường hợp này sẽ trông giống như sau.
+--------------+-----------+---------------+
|Name | Null? | Type |
+--------------+-----------+---------------+
|ID | NOT NULL | NUMBER(35) |
|DESCRIPTION | NOT NULL | VARCHAR2(4000)|
+--------------+-----------+---------------+
Sau khi tạo bảng này, tôi đang cố gắng chèn các lệnh sau đây INSERT
.
INSERT INTO temp_table (id, description) VALUES (1, null); ->unsuccessful
INSERT INTO temp_table (id, description) VALUES (2, ''); ->unsuccessful
Cả hai đều không thành công như rõ ràng bởi vì các hạn chế not null
được thi hành trên cột DESCRIPTION
.
Trong cả hai trường hợp, Oracle phàn nàn
ORA-01400: cannot insert NULL into ("WAGAFASHIONDB"."TEMP_TABLE"."DESCRIPTION")
Chuỗi trống được coi là một giá trị NULL
trong Oracle.
Nếu tôi bỏ not null
hạn chế trên cột DESCRIPTION
thì cấu trúc bảng cơ bản sẽ trông giống như sau
+--------------+-----------+---------------+
|Name | Null? | Type |
+--------------+-----------+---------------+
|ID | NOT NULL | NUMBER(35) |
|DESCRIPTION | | VARCHAR2(4000)|
+--------------+-----------+---------------+
và cả hai INSERT
lệnh theo quy định sẽ thành công. Họ sẽ tạo hai hàng một với giá trị null
và một hàng khác có một chuỗi trống ''
trong cột DESCRIPTION
của TEMP_TABLE
.
Bây giờ, nếu tôi hành SELECT
lệnh sau,
SELECT * FROM temp_table WHERE description IS NULL;
sau đó rồi nó lấy cả các hàng trong đó một có giá trị null
và người kia có một chuỗi rỗng ''
trong cột DESCRIPTION
.
Tuyên bố SELECT
sau tuy nhiên lấy không có hàng từ TEMP_TABLE
SELECT * FROM temp_table WHERE description='';
Nó thậm chí không lấy hàng trong đó có một chuỗi rỗng trong cột DESCRIPTION
.
Có lẽ, dường như Oracle đối xử với một giá trị null
và một chuỗi rỗng ''
khác nhau ở đây mà tuy nhiên không xuất hiện là trường hợp với tuyên bố INSERT
trong đó cả một giá trị null
và một chuỗi rỗng ''
là ngăn không cho chèn vào cột có giới hạn not null
. Tại sao nó như vậy?
Làm thế nào để bạn thấy rằng có một chuỗi rỗng trong một trong các trường mô tả và null trong trường khác? –
@ Flansch- Có lẽ, tôi giả định với những câu lệnh 'INSERT', vì tôi không biết rằng các chuỗi rỗng' '' 'được chuyển thành giá trị' null', xin lỗi. – Tiny
Bạn có thể muốn đọc [* this *] (http://stackoverflow.com/a/203536/1057429) – alfasin