为什么在Oracle中使用alter column修改数据类型报错?怎么样解决?
查资料后有大神说是因为在修改数据类型时,如果是小类型修改为大类型,不会报错;如果是大类型修改为小类型,则应先清除掉修改的字段的值
问题一:如果如上述所诉,char类型和varchar数据类型大小不一致吗?
问题二:清楚修改的字段的值使用update语句,但是我刚创建的表,表中并没有数据,应该清除什么字段呢?
命令行如下:SQL> create table course2(
  2  cno char(2) primary key,
  3  cname char(14) not null,
  4  cpno char(2),
  5  ccredit number(1) not null,
  6  foreign references course2(cno)
  7  );表已创建。SQL> insert into course2 values('2','数学',' ','2');
insert into course2 values('2','数学',' ','2')
            *
第 1 行出现错误:
ORA-00947: 没有足够的值
SQL> insert into course2 values('2','数学','2','2');
insert into course2 values('2','数学','2','2')
            *
第 1 行出现错误:
ORA-00947: 没有足够的值
SQL> alter table course2 alter column sname varchar(14);
alter table course2 alter column sname varchar(14)
                    *
第 1 行出现错误:
ORA-01735: 无效的 ALTER TABLE 选项
求大神仔细回复,感谢

解决方案 »

  1.   

    增加列
    alter table t add 修改列
    alter table t modify
      

  2.   

    请看下面的回复,并认真思考下自己的问题:--1.为什么在Oracle中使用alter column修改数据类型报错?怎么样解决?
    修改字段的语法:alter table tablename modify (column datatype [default value][null/not null],….);--2.问题一:如果如上述所诉,char类型和varchar数据类型大小不一致吗?
    char和varchar两种数据类型可以兼容。之后所有报错,是因为长度大小不一致。 长度改小肯定报错。--3.问题二:清楚修改的字段的值使用update语句,但是我刚创建的表,表中并没有数据,应该清除什么字段呢?
    --操作步骤如下:
    --(1)先备份原表
    create table course2_bak as select * from course2;--(2)清空原表数据
    truncate table course2;--(3)修改原表字段
    alter table course2 modify column sname varchar2(14);--(4)还原数据
    insert into course2 select * from course2_bak;
    commit;--4.第 1 行出现错误: ORA-00947: 没有足够的值
    course2表总共4个字段,你才给3个字段赋值,肯定报错啊。
      

  3.   

    文字部分看不懂 问题是不是后面代码部分报错ORA-00947?那是因为你没有在values子句里输入足够的字段值导致的,总共5个字段,你只输入了3个值,不要说只需要三个非空值(主键+量个not null字段),你必须在前面指定字段名,并在后面values子句的每个值与之前列的字段一一对应,这才是正确的语法,当然,对应的值应该满足字段上的约束,比如:
    insert into course2 (cno,cname,ccredit) values ('2','maths','2');
      

  4.   

    你6个字段 插入3个值肯定是要报错的。 alter table course2 alter column sname varchar(14) 这个是mssql的语法
      

  5.   

    在插入数据时之所以一直报错,是因为你建的表结果有问题。你可以看一下你创建的这个表的定义,就会发现,神奇的多了一列: "FOREIGN" CHAR(2 BYTE),所以才会一直报错 :没有足够的值。create table course2(
    cno char(2) primary key,
    cname char(14) not null,
    cpno char(2),
    ccredit number(1) not null,
    foreign references course2(cno) 这个要指定你的外键是哪一列,而不仅仅指定要引用的同一个表的主键cno列
    );  应该是  xx列  类型  foreign references course2(cno)中间不能有逗号