我在 Oracle SQL 資料庫中有兩列。這兩列的 data_default 為 '0000'
在 sqldeveloper 上,它們如下所示:
我想洗掉 data_default (不要問我為什么要在 nullable = No 列中這樣做)并達到以下狀態:
我嘗試了以下查詢:
ALTER TABLE table_name MODIFY column_name DEFAULT NULL
但我得到的結果是這樣的:
所以兩個問題:
- (null) 和 NULL(如果有)有什么區別?
- 有沒有辦法達到所需的狀態?
uj5u.com熱心網友回復:
在(null)
您的前兩個影像中,SQL Developer 顯示了一個真正的空值的虛擬值,所以您有一些東西可以看到。如果您轉到工具->首選項->資料庫->高級,則有一個“將空值顯示為”選項,該選項將設定為“(空)”。如果您將其更改為其他內容,那么它將顯示在您的查詢輸出中。
在第三張圖片中,該data_default
值并不是真正的 null,它是(長)字串值'NULL'
。
如果您從未為列設定默認值,那么data_default
它確實為空,但如果您設定它然后嘗試取消設定它,那么它不會恢復為真正的空值,它會保留為您為修改提供的任何值,正如您提供的那樣 - 包括案例。您將其設定為,NULL
因此顯示為NULL
; 如果您將其修改為,null
那么它將顯示null
.
在這里沒關系。基本上發生的情況是,當您執行插入并省略該列時,值形式data_default
嵌入在陳述句中。它實際上在幕后所做的可能是相當復雜的事情,但是您可以將其視為動態 SQL,并進行轉換:
'insert into table_name (id) values (42)'
至
'insert into table_name (id, column_name) values (42, '
|| (select data_default from user_tab_columns where column_name = 'COLUMN_NAME')
|| ')'
所以不管結果如何
'insert into table_name (id, column_name) values (42, null)'
或者
'insert into table_name (id, column_name) values (42, NULL)'
或者
'insert into table_name (id, column_name) values (42, NuLl)'
在你把它改回 null 之前,它會被有效地轉換為:
'insert into table_name (id, column_name) values (42, ''0000'')'
如果您創建一個包含沒有默認值的列的表,然后設定默認值,然后將其設定為 null,您會看到這種情況:
create table table_name (id number, column_name varchar2(4));
select column_name, data_type, data_default from user_tab_columns;
COLUMN_NAME | 資料型別 | DATA_DEFAULT |
---|---|---|
ID | 數字 | 無效的 |
COLUMN_NAME | VARCHAR2 | 無效的 |
insert into table_name (id) values (1);
alter table table_name modify column_name default '0000';
select column_name, data_type, data_default from user_tab_columns;
COLUMN_NAME | 資料型別 | DATA_DEFAULT |
---|---|---|
ID | 數字 | 無效的 |
COLUMN_NAME | VARCHAR2 | '0000' |
insert into table_name (id) values (2);
alter table table_name modify column_name default NuLl;
select column_name, data_type, data_default from user_tab_columns;
COLUMN_NAME | 資料型別 | DATA_DEFAULT |
---|---|---|
ID | 數字 | 無效的 |
COLUMN_NAME | VARCHAR2 | 無效的 |
insert into table_name (id) values (3);
select * from table_name;
ID | COLUMN_NAME |
---|---|
1 | 無效的 |
2 | 0000 |
3 | 無效的 |
小提琴
當沒有默認值并且存在空默認值時,實際的默認值是真正的空值(在 db<>fiddle 中以斜體顯示,而不是“(null)”)。
因此,在第二張影像中顯示“(null)”和在第三張影像中顯示“NULL”之間沒有實際區別。這只是設定和恢復值的人工制品,以及 Oracle 如何處理和記錄它。它不會影響您稍后插入表中的資料。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/530929.html