重庆分公司,新征程启航
为企业提供网站建设、域名注册、服务器等服务
如果安装了oracle软件最好,直接编辑就行了了,没有安装那么就alter table tablename rename column columnname to newcolumnname;在或者把columnname删除,在增加newcolumnname列。alter table tablename drop column columnname;alter table tablename add column newcolumnname;
成都创新互联成都网站建设按需设计,是成都网站推广公司,为户外休闲椅提供网站建设服务,有成熟的网站定制合作流程,提供网站定制设计服务:原型图制作、网站创意设计、前端HTML5制作、后台程序开发等。成都网站推广热线:028-86922220
添加字段并附值
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);1SQLselect*fromv$version;23BANNER4--------------------------------------------------------------------------------5OracleDatabase11g Enterprise Edition Release11.2.
0.1.0-64bitProduction6PL/SQL Release11.2.
0.1.0-Production7CORE11.2.
0.1.0Production8TNSforLinux: Version11.2.
0.1.0-Production9NLSRTL Version11.2.
0.1.0-Production
1.修改字段数据类型时,如果该列有数据则报ORA-01439: column to be modified must be empty to change datatype,此时需要通过另外一种方法修改:1SQLaltertablezytaddid_tempvarchar2(10);23Tablealtered.45SQLcommit;67Commitcomplete.89SQLselect*fromzyt;1011NAME ID ID_TEMP12---------- ---------- ----------13zyt1114david21516SQLaltertablezyt renamecolumnidtoid_bak;1718Tablealtered.1920SQLselect*fromzyt;2122NAME ID_BAK ID_TEMP23---------- ---------- ----------24zyt1125david22627SQLdesczyt;28NameNull? Type29----------------------------------------- -------- ----------------------------30NAMEVARCHAR2(10)31ID_BAKNOTNULLNUMBER(2)32ID_TEMPVARCHAR2(10)3334SQLupdatezytsetID_TEMP=cast(ID_BAKasvarchar2(10));35362rows updated.3738SQLcommit;3940Commitcomplete.4142SQLselect*fromzyt;4344NAME ID_BAK ID_TEMP45---------- ---------- ----------46zyt11147david224849SQLaltertablezytdropcolumnID_BAK;5051Tablealtered.5253SQLcommit;5455Commitcomplete.5657SQLselect*fromzyt;5859NAME ID_TEMP60---------- ----------61zyt1162david26364SQLdesczyt;65NameNull? Type66----------------------------------------- -------- ----------------------------67NAMEVARCHAR2(10)68ID_TEMPVARCHAR2(10)备注:这种方法能满足需求,因新增字段默认添加到表末尾,有可能发生行迁移,对应用程序会产生影响,同时也涉及复杂数据,不算最好的方法
2.建立一个中间跳板,临时存储数据1SQLdesczyt;2NameNull? Type3----------------------------------------- -------- ----------------------------4NAMEVARCHAR2(10)5IDVARCHAR2(10)67SQLselect*fromzyt;89NAME ID10---------- ----------11zyt1112david21314SQLaltertablezytaddid_tempVARCHAR2(10)1516Tablealtered.1718SQLselect*fromzyt;1920NAME ID ID_TEMP21---------- ---------- ----------22zyt1123david22425SQLupdatezytsetID_TEMP=id,id=null;26272rows updated.2829SQLselect*fromzyt;3031NAME ID ID_TEMP32---------- ---------- ----------33zyt1134david23536SQLaltertablezyt modify idnumber(10);3738Tablealtered.3940SQLdesczyt;41NameNull? Type42----------------------------------------- -------- ----------------------------43NAMEVARCHAR2(10)44IDNUMBER(10)45ID_TEMPVARCHAR2(10)4647SQLupdatezytsetid=ID_TEMP,ID_TEMP=null;48492rows updated.5051SQLselect*fromzyt;5253NAME ID ID_TEMP54---------- ---------- ----------55zyt1156david25758SQLaltertablezytdropcolumnID_TEMP;5960Tablealtered.6162SQLcommit;6364Commitcomplete.6566SQLselect*fromzyt;6768NAME ID69---------- ----------70zyt1171david27273SQLdesczyt;74NameNull? Type75----------------------------------------- -------- ----------------------------76NAMEVARCHAR2(10)77IDNUMBER(10)备注:第二种方法,是增加一个与被修改的列类型一样的列,之后将要修改列的数据复制到新增的列并置空要修改的列,之后修改数据类型,再从新增列将数据拷贝回来,该过程涉及两次数据复制,如果是数据量很多,会比较慢同时也会产生很多undo和redo;优点是数据不会发生行迁移。
分为两步来实现,首先插入数据,假设表T,有字段col1,col2,col3,需要向前200行的col2插入行数+1的值,并将col2变为第一列,
插入数据有两种方法:
1》直接update即:UPDATE T SET T.COL2 = ROWNUM + 1 WHERE ROWNUM =200;
2》写一个存储过程
CREATE OR REPLACE PROCEDURE INS IS
BEGIN
FOR I IN 1 .. 200 LOOP
INSERT INTO T (COL2) VALUES (I);
END LOOP;
COMMIT;
END;
编译并运行该过程,插入列即完成。
下面将COL2列调整为第一列:
方法一:借用临时表,建temp表与t表的表结构、数据完全一致,重建t表,调整字段顺序,再将temp表的数据导回来,即
CREATE TABLE TEMP AS SELECT * FROM T;
CREATE TABLE T(
COL2 TYPE,
COL1 TYPE,
COL3 TYPE
);
INSERT INTO T
SELECT COL2,COL1,COL3 FROM TEMP;
COMMIT;
DROP TABLE TEMP;
此方法需要足够的空间、回滚段和时间消耗
方法2:利用数据库表对象更新字段的序列号
在当前表用户下使用下面命令查询T对象的编号:
select OBJECT_name,object_id from all_objects where object_name='T';(注意一定要大写)
SQL /
OBJECT_NAME OBJECT_ID
------------------------------ ----------
T 50555
切换到sys帐号下
select obj#,col#,name from col$ where obj#=50555;
OBJ# COL# NAME
---------- ---------- ----------------------------
50555 1 COL1
50555 2 COL2
50555 3 COL3
Elapsed: 00:00:00.03
下面可以通过修改这个系统表来实现修改列名与顺序,注意,COL#就是列的顺序。
UPDATE COL$ SET COL#=2 WHERE OBJ#=50555 and name='COL1';
UPDATE COL$ SET COL#=1 WHERE OBJ#=50555 and name='COL2';
再次查询
select obj#,col#,name from col$ where obj#=50555;
OBJ# COL# NAME
---------- ---------- ------------------------------
50555 1 COL2
50555 2 COL1
50555 2 COL3
提交修改commit ;
重启服务
SQL SHUTDOWN IMMEDIATE
SQLSTARTUP
重新登录表用户下,查询SELECT * FROM T;
COL2 COL1 COL3
至此列顺序调整成功
最好的方法是批量修改,即每次修改5000条(一次修改不要超过一万条,否则影响性能). 虽然在11g中,我们也可以选择使用merge命令,但你的这种情况最好先修改一部分然后看看影响,毕竟在生产环境作这样的操作风险很大。如果是误操作,最好还是请DBA来恢复,虽然这样做会被挨骂,但总比错上加错,最后连挨骂的机会都没有要好得多。如果对这些修改真的有信心,而只是从性能考虑,那可以用下面的方法(pk_col 是表的主键
1、构建临时表进行主键关联更新
需求:T1表有千万级别的数据量,需要更新这个表的字段a,b满足2个条件的记录。
做法:一般业务会将条件通过excel表格提供给开发,那么开发首先需要将这个excel表格的内容插入到临时表T2中,考虑到a,b都不是主键,那么需要将a,b转化成主键后再插入到T2表中,T2表中还可以保存更新前的数据,方便做数据回滚,T2表中有数据后,就可以执行下面脚本进行更新操作:
ps:c,d是需要更新的操作,e,f是条件。必须强调的是id必须是主键
1、构建临时表进行主键关联更新
需求:T1表有千万级别的数据量,需要更新这个表的字段a,b满足2个条件的记录。
做法:一般业务会将条件通过excel表格提供给开发,那么开发首先需要将这个excel表格的内容插入到临时表T2中,考虑到a,b都不是主键,那么需要将a,b转化成主键后再插入到T2表中,T2表中还可以保存更新前的数据,方便做数据回滚,T2表中有数据后,就可以执行下面脚本进行更新操作:
ps:c,d是需要更新的操作,e,f是条件。必须强调的是id必须是主键
如果列名不适合,那么可以使用alter
table语句的rename
column子句改变列名。语法如下:
alter
table
table_name
rename
column
column_name
to
new_column_name;
你这一题该是
alter
text
rename
textpass
to
password
去试下!
你可以先把类型为varchar的字段该名,再加以个字段为要该为date的字段名相同, 二, 1,测试表create table TEST(ID NUMBER not null, NAME VARCHAR2(20))ALTER TABLE SCOTT.TEST RENAME TO TEST1--修改表名 ALTER TABLE SCOTT.TEST RENAME COLUMN NAME TO NAME1 --修改表列名 ALTER TABLE SCOTT.TEST MODIFY NAME1 NUMBER(20) --修改字段类型 ALTER TABLE SCOTT.TEST ADD ADD RESS VARCHAR2(40) --添加表列 ALTER TABLE SCOTT.TEST DROP COLUMN RESS--删除表列三, ALTER TABLE gtsysusr.SCHEDULE_CONTENTS MODIFY CONTENTS_ID NVARCHAR2(64) 另建一个表,把varchar改成date,然后用SQL转一下插入,然后删除原表,然后改目标表名字。应该可以了。 四,