链接:http://www.cnblogs.com/david-zhang-index/archive/2012/04/10/2441015.html
对字段操作 | 操作方法 |
更新字段名 | alter table TABLE_NAME rename column column_old to column_new; |
添加字段 | alter table TABLE_NAME add COLUMN_NAME varchar(10); |
删除字段 | alter table TABLE_NAME drop column COLUMN_NAME; |
添加字段并附值 | alter table TABLE_NAME ADD COLUMN_NAME NUMBER(1) DEFAULT 1; |
修改字段值 | update TABLE_NAME set filedname=value where filedname=value; |
修改字段数据类型 | alter table tablename modify filedname varchar2(20); |
一般的方式:
alter table students modify(sid number(10));
肯定是不行的,因为有主从关系嘛
另一种方式是创建一个临时的列(列类型为number(10)),将SID更名(更名我觉得没有实质的作用),然后将SID的数据全部导入到SID_TEMP中去update zyt set ID_TEMP = cast(ID_BAK as varchar2(10)); ,然后删除SID(这里我是删除不了的,因为是主键),将SID_TEMP更名为SID
还有一种方式是,创建临时的列(列类型为varchar2(10)),这里的列是临时存数据用的,与上面一致,当SID_TEMP中的数据与一致时候,用的语句不一样:update zyt set ID_TEMP=sid,sid=null;这里出错,sid不能置为空,然后alter table zyt modify id number(10);alter table zyt drop column ID_TEMP;就可以了。
from user_cons_columns
where table_name='students';
SQL> alter table students
2.生成所有引用要删除表的外键的创建语句.
3.执行步骤2中产生的SQL语句,获取外键定义.
4.删除表.
5.删除并重建表.
6.建立因创建该表所删除的外键约束.
7.检查各外键是否得到恢复,系统是否正常.
2
3 BANNER
4 - -------------------------------------------------------------------------------
5 Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - 64bit Production
6 PL/SQL Release 11.2.0.1.0 - Production
7 CORE
8 TNS for Linux: Version 11.2.0.1.0 - Production
9 NLSRTL Version 11.2.0.1.0 - Production
1.修改字段数据类型时,如果该列有数据则报ORA-01439: column to be modified must be empty to change datatype,此时需要通过另外一种方法修改:
10 ---------------------
11 NAME
12 ---------- ---------- ----------
13 zyt1
14 david
15 -----------------------------------------------
16 SQL> alter table zyt rename column id to id_bak;
17 -----------------------------------
18 Table altered.
19 -----------------------------
20 SQL> select * from zyt;
21
22 NAME
23 ---------- ---------- ----------
24 zyt1
25 david
26 ------------------------------------
27 SQL> desc zyt;
28
29
30
31
32
33 ----------------------------------------------------------------------------------
34 SQL> update zyt set ID_TEMP = cast(ID_BAK as varchar2(10));
35 -----------------
36 2 rows updated.
37 ----------------------------
38 SQL> commit;
39 ---------------
40 Commit complete.
41 -----------------
42 SQL> select * from zyt;
43 --------------------------
44 NAME
45 ---------- ---------- ----------
46 zyt1
47 david
48 -----------------------------------
49 SQL>
50 ---------------------------------
51 Table altered.
52 ----------------------------------------
53 SQL> commit;
54 --------------
55 Commit complete.
56 ------------------
57 SQL> select * from zyt;
58 ------------------------------------------------
59 NAME
60 ---------- ----------
61 zyt1
62 david
63 ----------------------------------
64 SQL> desc zyt;
65
66
67
68
备注:这种方法能满足需求,因新增字段默认添加到表末尾,有可能发生行迁移,对应用程序会产生影响,同时也涉及复杂数据,不算最好的方法
10 ---------- ----------
11 zyt1
12 david
13 ------------------------------------------------------------------
14 SQL> alter table zyt add id_temp VARCHAR2(10)
15 -----------------------------------------
16 Table altered.
17 -------------------------------
18 SQL> select * from zyt;
19 ------------------------------
20 NAME
21 ---------- ---------- ----------
22 zyt1
23 david
24 -----------------------------------------------
25 SQL> update zyt set ID_TEMP=id,id=null;
26 -----------------------------------------------------------------
27 2 rows updated.
28 -------------------------------
29 SQL> select * from zyt;
30 ---------------------
31 NAME
32 ---------- ---------- ----------
33 zyt1
34 david
35 ------------------------------------
36 SQL> alter table zyt modify id number(10);
37 -----------------
38 Table altered.
39 ------------------------
40 SQL> desc zyt;
41
42
43
44
45
46 ---------------------------
47 SQL> update zyt set id=ID_TEMP,ID_TEMP=null;
48 ----------------------------
49 2 rows updated.
50 ---------------------------------------
51 SQL> select * from zyt;
52 -----------------------------
53 NAME
54 ---------- ---------- ----------
55 zyt1
56 david
57 ---------------------------
58 SQL> alter table zyt drop column ID_TEMP;
59 ----------------------------
60 Table altered.
61 --------------------
62 SQL> commit;
63 ----------------------------------------
64 Commit complete.
65 --------------------------------
66 SQL> select * from zyt;
67 -------------------------------------
68 NAME
69 ---------- ----------
70 zyt1
71 david
72 ------------------------------------------
73 SQL> desc zyt;
74
75
76
77
备注:第二种方法,是增加一个与被修改的列类型一样的列,之后将要修改列的数据复制到新增的列并置空要修改的列,之后修改数据类型,再从新增列将数据拷贝回来,该过程涉及两次数据复制,如果是数据量很多,会比较慢同时也会产生很多undo和redo;优点是数据不会发生行迁移。