Oracle 基礎知識 新手學習詳解二

接上新手學習詳解一知識點。每天學習一點,給自己加油!

(正文):添加列

語法 : alter table 表名 add (字段 字段類型) [ default '輸入默認值'] [null/not null]

在空表中可以直接添加非空列

SQL> ALTER TABLE trouble ADD(

condition VARCHAR2(9) NOT NULL DEFAULT 'no',

wind NUMBER(3)

);

在有數據的表中添加非空列會出現 table must be empty to add mandatory (NOT NULL) column 錯誤,因為新添加的列為空,可以先不添加 NO NULL 增加完列後修改這列使之有數據然後再修改列增加 NO NULL

SQL> ALTER TABLE trouble ADD(

condition VARCHAR2(9),

wind NUMBER(3)

);

SQL> UPDATE trouble SET condition='no';

SQL> ALTER TABLE trouble MODIFY(condition VARCHAR2(9) NOT NULL);

更改列

SQL> DESCRIBE trouble;

Name Type Nullable Default Comments

------------- ------------ -------- ------- --------

CITY VARCHAR2(13)

SAMPLE_DATE DATE

NOON NUMBER(4,1) Y

MIDNIGHT NUMBER(4,1) Y

PRECIPITATION NUMBER Y

CONDITION VARCHAR2(9)

WIND NUMBER(3) Y

SQL> ALTER TABLE trouble MODIFY(city VARCHAR2(17));

SQL> DESCRIBE trouble;

Name Type Nullable Default Comments

------------- ------------ -------- ------- --------

CITY VARCHAR2(17)

SAMPLE_DATE DATE

NOON NUMBER(4,1) Y

MIDNIGHT NUMBER(4,1) Y

PRECIPITATION NUMBER Y

CONDITION VARCHAR2(9)

WIND NUMBER(3) Y

設置表只讀

設置表只讀這樣就可以限制表的 INSERT、UPDATE 和 DELETE 操作

SQL> INSERT INTO trouble(city,sample_date) VALUES('武漢',SYSDATE);

1 row inserted

SQL> ALTER TABLE trouble READ ONLY;

Table altered

SQL> INSERT INTO trouble(city,sample_date) VALUES('成都',SYSDATE);

INSERT INTO trouble(city,sample_date) VALUES('成都',SYSDATE)

ORA-12081: update operation not allowed on table "C##CHENSHUN"."TROUBLE"

# 恢復表可讀可寫

SQL> ALTER TABLE trouble READ WRITE;

Table altered

SQL> INSERT INTO trouble(city,sample_date) VALUES('成都',SYSDATE);

1 row inserted

刪除列

刪除列比添加或修改列更復雜,因為 Oracle 必須執行一些額外工作。刪除表中一列很簡單,複雜的是恢復列佔用的空間。將該列標記為 "unused" 稍後再刪除,不會影響性能。如果立即刪除,該操作會影響性能。可以使用 ALTER TABLE命令

SQL> SELECT* FROM trouble;

CITY SAMPLE_DATE NOON MIDNIGHT PRECIPITATION CONDITION WIND

----------------- ----------- ----- -------- ------------- --------- ----

Pleasant Lake 2011-3-21 40.0 -1.3 3.6 no

Pleasant Lake 2011-9-23 92.9 79.6 1.00003 no

Pleasant Lake 2011-12-22 -17.4 -10.4 2.4 no

武漢 2018-1-29 1

成都 2018-1-29 1

SQL> ALTER TABLE trouble DROP COLUMN wind; # 刪除多列 ALTER TABLE trouble DROP (wind,condition);

Table altered

SQL> SELECT * FROM trouble;

CITY SAMPLE_DATE NOON MIDNIGHT PRECIPITATION CONDITION

----------------- ----------- ----- -------- ------------- ---------

Pleasant Lake 2011-3-21 40.0 -1.3 3.6 no

Pleasant Lake 2011-9-23 92.9 79.6 1.00003 no

Pleasant Lake 2011-12-22 -17.4 -10.4 2.4 no

武漢 2018-1-29 1

成都 2018-1-29 1

標記列為 UNUSED,此時該列無法讀取但空間不會釋放,除非使用 DROP 刪除列

SQL> SELECT * FROM trouble;

CITY SAMPLE_DATE NOON MIDNIGHT PRECIPITATION CONDITION

----------------- ----------- ----- -------- ------------- ---------

Pleasant Lake 2011-3-21 40.0 -1.3 3.6 no

Pleasant Lake 2011-9-23 92.9 79.6 1.00003 no

Pleasant Lake 2011-12-22 -17.4 -10.4 2.4 no

武漢 2018-1-29 1

成都 2018-1-29 1

SQL> ALTER TABLE trouble SET UNUSED COLUMN condition;

Table altered

SQL> SELECT * FROM trouble;

CITY SAMPLE_DATE NOON MIDNIGHT PRECIPITATION

----------------- ----------- ----- -------- -------------

Pleasant Lake 2011-3-21 40.0 -1.3 3.6

Pleasant Lake 2011-9-23 92.9 79.6 1.00003

Pleasant Lake 2011-12-22 -17.4 -10.4 2.4

武漢 2018-1-29 1

成都 2018-1-29 1

SQL> ALTER TABLE trouble DROP UNUSED COLUMNS;

Table altered

根據一個表創建另一個表,同時拷貝對應的數據

SQL> CREATE TABLE rain_table AS SELECT city,precipitation FROM trouble WHERE city IS NOT NULL;

Table created

SQL> SELECT * FROM rain_table;

CITY PRECIPITATION

----------------- -------------

Pleasant Lake 3.6

Pleasant Lake 1.00003

Pleasant Lake 2.4

武漢

成都


分享到:


相關文章: