2012-12-01 58 views
0

一个表至今包含一个包含数值的列。现在我想用字母输入详细信息。如何在不丢失旧数据的情况下实现?Oracle-SQL中的查询

EX:

创建一个student表和值插入

这里SFEE给出的数值数据类型:

SNO SNAME SCOURSE SFEE 
1 RAM SQL  2100 
2 JAM JAVA 3000 

SNO SNAME SCOURSE SFEE 
1 RAM SQL  2100 
2 JAM JAVA 3000 
3 TOM LINUX AJAY 

SELECT * FROM STUDENT; 

SNO SNAME SCOURSE SFEE 
1 RAM SQL  2100 
2 JAM JAVA 3000 
3 TOM LINUX AJAY 
+4

你为什么在美国? –

+0

这似乎是一个数据库问题:哪一个? – Richard

+2

这可能有所帮助。 http://dba-oracle.com/t_alter_table_change_column_data_type.htm – FoolishSeth

回答

0

你可以改变数据类型如果列是空的:

ALTER TABLE student MODIFY (sfee VARCHAR2(10)); 

如果您需要保留数据,如你说,你可以重命名列,用新的数据类型添加新列,该数据在复制和删除改名为旧列:

CREATE TABLE student (sno NUMBER, sname VARCHAR2(10), scourse VARCHAR2(10), sfee NUMBER); 
INSERT INTO student VALUES (1, 'RAM', 'SQL', 2100); 
INSERT INTO student VALUES (2, 'JAM', 'JAVA', 3000); 

ALTER TABLE student RENAME COLUMN sfee TO sfee_old; 
ALTER TABLE student ADD (sfee VARCHAR2(10)); 
UPDATE student SET sfee = TO_CHAR(sfee_old,'fm9999'); 
ALTER TABLE student DROP COLUMN sfee_old; 

如果它是一个大桌子,我建议你到物理重建它:

ALTER TABLE student MOVE; 

现在SFEE可以存储字符串值:

INSERT INTO student VALUES (3, 'TOM', 'LINUX', 'AJAY'); 
SELECT * FROM student; 

如果它是一个庞大的生产表,我建议你简单地创建一个新表:

CREATE TABLE student_tmp AS 
SELECT sno, sname, scourse, to_char(sfee,'fm9999') as sfee FROM student; 
DROP TABLE student; 
RENAME student_tmp TO student; 

最后一个问题:为什么SQL课程比Java课程更便宜;-)?