Oracle Alter Table Modify列语句

在本教程中,您将学习如何使用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,
    ...
);

Oracle ALTER TABLE MODIFY列示例

首先,为演示建立一个名为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;

执行上面查询语句,获得如下结果 -教程

1. 修改列的可见性

在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;

2. 容许或不容许null示例

如下语句将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;

如今,它应该就会按预期那样工做了。

3. 扩大或缩短列示例的大小

假设要添加国际代码到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 );

4. 修改虚拟列

假设按如下两列的格式填写全名:

last_name, first_name

为此,能够更改虚拟列full_name的表达式,以下所示:

ALTER TABLE accounts 
MODIFY full_name VARCHAR2(52) 
GENERATED ALWAYS AS (last_name || ', ' || first_name);

如下语句验证修改:

SELECT
    *
FROM
    accounts;

执行上面查询语句,能够看到如下结果 -

5. 修改列的默认值

添加一个名为status的新列,默认值为1accounts表中。参考如下语句 -

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;

执行上面查询语句,应该看相似下面的结果 -

正如所看到的那样,ID4的帐户的status列的值是0

在本教程中,您已学习如何使用OracleALTER TABLE MODIFY列语句来更改表中现有列的定义。

相关文章
相关标签/搜索