在oracle中,可以利用“ALTER TABLE MODIFY”語句來修改字段,語法為“ALTER TABLE 表名 MODIFY 字段名 需要執(zhí)行的操作;”;常用操作有:修改列的可見性、更改列的默認(rèn)值、修改虛擬列的表達(dá)式等。
本教程操作環(huán)境:Windows7系統(tǒng)、Oracle 11g版、Dell G3電腦。
oracle數(shù)據(jù)庫怎么修改字段
在oracle中,可以利用“ALTER TABLE MODIFY
”語句來修改字段,更改現(xiàn)有字段的定義。
要更改表中列的定義,請(qǐng)按如下所示使用ALTER TABLE MODIFY
列語法:
ALTER TABLE 表名 MODIFY 字段名 需要執(zhí)行的操作;
語句很直接。要修改表的列,需要指定要執(zhí)行的列名,表名和操作。
Oracle允許執(zhí)行多種操作,但以下是主要常用的操作:
-
修改列的可見性
-
允許或不允許NULL值
-
縮短或擴(kuò)大列的大小
-
更改列的默認(rèn)值
-
修改虛擬列的表達(dá)式
要修改多個(gè)列,請(qǐng)使用以下語法:
ALTER TABLE 表名 MODIFY ( 字段名1 action, 字段名2 action, ... );
Oracle ALTER TABLE MODIFY列示例
首先,為演示創(chuàng)建一個(gè)名為accounts
的新表:
-- 12c語法 CREATE TABLE accounts ( account_id NUMBER GENERATED BY DEFAULT AS IDENTITY, first_name VARCHAR2(25) NOT NULL, last_name VARCHAR2(25) NOT NULL, email VARCHAR2(100), phone VARCHAR2(12) , full_name VARCHAR2(51) GENERATED ALWAYS AS( first_name || ' ' || last_name ), PRIMARY KEY(account_id) );
其次,向accounts
表中插入一些行:
INSERT INTO accounts(first_name,last_name,phone) VALUES('Trinity', 'Knox', '410-555-0197'); INSERT INTO accounts(first_name,last_name,phone) VALUES('Mellissa', 'Porter', '410-555-0198'); INSERT INTO accounts(first_name,last_name,phone) VALUES('Leeanna', 'Bowman', '410-555-0199');
第三,通過使用下面的SELECT
語句驗(yàn)證插入操作:
SELECT * FROM accounts;
執(zhí)行上面查詢語句,得到以下結(jié)果 –
1. 修改列的可見性
在Oracle 12c中,可以將表列定義為不可見或可見。不可見列不可用于查詢,如:
SELECT * FROM table_name;
或者,
DESCRIBE table_name;
都是查到不到不可見列的。
但是,可以通過在查詢中顯式指定不可見列來查詢:
SELECT invisible_column_1, invisible_column_2 FROM table_name;
默認(rèn)情況下,表列是可見的??梢栽趧?chuàng)建表或使用ALTER TABLE MODIFY
列語句時(shí)定義不可見列。
例如,以下語句使full_name
列不可見:
ALTER TABLE accounts MODIFY full_name INVISIBLE;
執(zhí)行再次查詢表中數(shù)據(jù),得到以下結(jié)果 –
以下語句返回accounts
表除了full_name
列以外的所有列中返回?cái)?shù)據(jù):
SELECT * FROM accounts;
這是因?yàn)?code>full_name列是不可見的。要將列從不可見變?yōu)榭梢?,?qǐng)使用以下語句:
ALTER TABLE accounts MODIFY full_name VISIBLE;
2. 允許或不允許null示例
以下語句將email
列更改為接受非空(not null
)值:
ALTER TABLE accounts MODIFY email VARCHAR2( 100 ) NOT NULL;
但是,Oracle發(fā)出以下錯(cuò)誤:
SQL Error: ORA-02296: cannot enable (OT.) - null values found
因?yàn)楫?dāng)將列從可為null
改為not null
時(shí),必須確保現(xiàn)有數(shù)據(jù)符合新約束(也就是說,如果原來數(shù)據(jù)中NULL
是不行的)。
為了解決這個(gè)問題,首先更新email
列的值:
UPDATE accounts SET email = LOWER(first_name || '.' || last_name || '@oraok.com') ;
請(qǐng)注意,LOWER()函數(shù)將字符串轉(zhuǎn)換為小寫字母。
然后改變email
列的約束:
ALTER TABLE accounts MODIFY email VARCHAR2( 100 ) NOT NULL;
現(xiàn)在,它應(yīng)該就會(huì)按預(yù)期那樣工作了。
3. 擴(kuò)大或縮短列示例的大小
假設(shè)要添加國際代碼到phone
列上,比如:前綴加上+86
。 在修改列的值之前,必須使用以下語句擴(kuò)大phone
列的大?。?/p>
ALTER TABLE accounts MODIFY phone VARCHAR2( 24 );
現(xiàn)在,我們可以更新電話號(hào)碼的數(shù)據(jù)了:
UPDATE accounts SET phone = '+86 ' || phone;
以下語句驗(yàn)證更新:
SELECT * FROM accounts;
執(zhí)行上面查詢語句結(jié)果中,應(yīng)該可以看到原電話號(hào)碼前綴有加上+86
的國際區(qū)號(hào)了。
要縮短列的大小,請(qǐng)確保列中的所有數(shù)據(jù)都符合新的大小。
例如,嘗試將phone
列的大小縮減到12
個(gè)字符:
ALTER TABLE accounts MODIFY phone VARCHAR2( 12 );
Oracle數(shù)據(jù)庫發(fā)出以下錯(cuò)誤:
SQL Error: ORA-01441: cannot decrease column length because some value is too big
要解決這個(gè)問題,首先,應(yīng)該從電話號(hào)碼中刪除國際代碼(即:+86
):
UPDATE accounts SET phone = REPLACE( phone, '+86 ', '' );
REPLACE()函數(shù)用一個(gè)新的子字符串替換一個(gè)子字符串。在這種情況下,它將用空字符串替換+86
。
然后縮短phone
列的大?。?/p>
ALTER TABLE accounts MODIFY phone VARCHAR2( 12 );
4. 修改虛擬列
假設(shè)按以下兩列的格式填寫全名:
last_name, first_name
為此,可以更改虛擬列full_name
的表達(dá)式,如下所示:
ALTER TABLE accounts MODIFY full_name VARCHAR2(52) GENERATED ALWAYS AS (last_name || ', ' || first_name);
以下語句驗(yàn)證修改:
SELECT * FROM accounts;
執(zhí)行上面查詢語句,可以看到以下結(jié)果
5. 修改列的默認(rèn)值
添加一個(gè)名為status
的新列,默認(rèn)值為1
到accounts
表中。參考以下語句 –
ALTER TABLE accounts ADD status NUMBER( 1, 0 ) DEFAULT 1 NOT NULL ;
當(dāng)執(zhí)行了該語句,就會(huì)將accounts
表中的所有現(xiàn)有行的status
列中的值設(shè)置為1
。
要將status
列的默認(rèn)值更改為0
,請(qǐng)使用以下語句:
ALTER TABLE accounts MODIFY status DEFAULT 0;
可以在accounts
表中添加一個(gè)新行來檢查status
列的默認(rèn)值是0
還是1
:
INSERT INTO accounts ( first_name, last_name, email, phone ) VALUES ( 'Julia', 'Madden', 'julia.madden@oraok.com', '410-555-0200' );
現(xiàn)在,查詢accounts
表中的數(shù)據(jù):
SELECT * FROM accounts;
執(zhí)行上面查詢語句,應(yīng)該看類似下面的結(jié)果
正如所看到的那樣,ID
為4
的賬戶的status
列的值是0
。
推薦教程:《Oracle教程》