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

武汉

成都


分享到:


相關文章: