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列語句來更改表中現有列的定義。

相關文章
相關標籤/搜索