在本教程中,您将学习如何使用Oracle ALTER TABLE MODIFY
列语句来更改现有列的定义。html
要更改表中列的定义,请按以下所示使用ALTER TABLE MODIFY
列语法:sql
ALTER TABLE table_name MODIFY column_name action;
语句很直接。要修改表的列,须要指定要执行的列名,表名和操做。数据库
Oracle容许执行多种操做,但如下是主要经常使用的操做:oracle
NULL
值要修改多个列,请使用如下语法:函数
ALTER TABLE table_name MODIFY ( column_name_1 action, column_name_2 action, ... );
首先,为演示建立一个名为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
表中插入一些行:code
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语句验证插入操做:htm
SELECT * FROM accounts;
执行上面查询语句,获得如下结果 -教程
在Oracle 12c中,能够将表列定义为不可见或可见。不可见列不可用于查询,如:字符串
SELECT * FROM table_name;
或者,
DESCRIBE table_name;
都是查到不到不可见列的。
可是,能够经过在查询中显式指定不可见列来查询:
SELECT invisible_column_1, invisible_column_2 FROM table_name;
默认状况下,表列是可见的。能够在建立表或使用ALTER TABLE MODIFY
列语句时定义不可见列。
例如,如下语句使full_name
列不可见:
ALTER TABLE accounts MODIFY full_name INVISIBLE;
执行再次查询表中数据,获得如下结果 -
如下语句返回accounts
表除了full_name
列之外的全部列中返回数据:
SELECT * FROM accounts;
这是由于full_name
列是不可见的。要将列从不可见变为可见,请使用如下语句:
ALTER TABLE accounts MODIFY full_name VISIBLE;
如下语句将email
列更改成接受非空(not null
)值:
ALTER TABLE accounts MODIFY email VARCHAR2( 100 ) NOT NULL;
可是,Oracle发出如下错误:
SQL Error: ORA-02296: cannot enable (OT.) - null values found
由于当将列从可为null
改成not null
时,必须确保现有数据符合新约束(也就是说,若是原来数据中NULL
是不行的)。
为了解决这个问题,首先更新email
列的值:
UPDATE accounts SET email = LOWER(first_name || '.' || last_name || '@oraok.com') ;
请注意,LOWER()函数将字符串转换为小写字母。
而后改变email
列的约束:
ALTER TABLE accounts MODIFY email VARCHAR2( 100 ) NOT NULL;
如今,它应该就会按预期那样工做了。
假设要添加国际代码到phone
列上,好比:前缀加上+86
。 在修改列的值以前,必须使用如下语句扩大phone
列的大小:
ALTER TABLE accounts MODIFY phone VARCHAR2( 24 );
如今,咱们能够更新电话号码的数据了:
UPDATE accounts SET phone = '+86 ' || phone;
如下语句验证更新:
SELECT * FROM accounts;
执行上面查询语句结果中,应该能够看到原电话号码前缀有加上+86
的国际区号了。
要缩短列的大小,请确保列中的全部数据都符合新的大小。
例如,尝试将phone
列的大小缩减到12
个字符:
ALTER TABLE accounts MODIFY phone VARCHAR2( 12 );
Oracle数据库发出如下错误:
SQL Error: ORA-01441: cannot decrease column length because some value is too big
要解决这个问题,首先,应该从电话号码中删除国际代码(即:+86
):
UPDATE accounts SET phone = REPLACE( phone, '+86 ', '' );
REPLACE()函数用一个新的子字符串替换一个子字符串。在这种状况下,它将用空字符串替换+86
。
而后缩短phone
列的大小:
ALTER TABLE accounts MODIFY phone VARCHAR2( 12 );
假设按如下两列的格式填写全名:
last_name, first_name
为此,能够更改虚拟列full_name
的表达式,以下所示:
ALTER TABLE accounts MODIFY full_name VARCHAR2(52) GENERATED ALWAYS AS (last_name || ', ' || first_name);
如下语句验证修改:
SELECT * FROM accounts;
执行上面查询语句,能够看到如下结果 -
添加一个名为status
的新列,默认值为1
到accounts
表中。参考如下语句 -
ALTER TABLE accounts ADD status NUMBER( 1, 0 ) DEFAULT 1 NOT NULL ;
当执行了该语句,就会将accounts
表中的全部现有行的status
列中的值设置为1
。
要将status
列的默认值更改成0
,请使用如下语句:
ALTER TABLE accounts MODIFY status DEFAULT 0;
能够在accounts
表中添加一个新行来检查status
列的默认值是0
仍是1
:
INSERT INTO accounts ( first_name, last_name, email, phone ) VALUES ( 'Julia', 'Madden', 'julia.madden@oraok.com', '410-555-0200' );
如今,查询accounts
表中的数据:
SELECT * FROM accounts;
执行上面查询语句,应该看相似下面的结果 -
正如所看到的那样,ID
为4
的帐户的status
列的值是0
。
在本教程中,您已学习如何使用OracleALTER TABLE MODIFY
列语句来更改表中现有列的定义。