如何在不影响已存在的值的情况下更改列的属性?

时间:2009-06-04 12:11:28

标签: sql database oracle alter-table

简而言之 - 在oracle db中,我想创建一个varchar2(16)列,它现在是varchar2(8),而不会影响值presnet。我已经尝试过了,它确实很奇怪。

我试过的查询是 - alter table SOME_TABLE modify(SOME_COL varchar2(16)); 但是表中已经存在的值(有些不是全部)得到了 当我运行上述查询时,'\ 0'附加到它们上。

那么,做我想做的事的正确方法是什么?

4 个答案:

答案 0 :(得分:3)

表格中的原始数据正在改变,这是非常值得怀疑的。由于您的一些评论意味着您使用SQLPlus以外的工具和应用程序来查看和处理数据,我认为您需要查看它们是否以某种方式错误处理数据。

这是一个例子,我尝试重现你在直接SQLPlus中所做的事情。没有空字节附加到现有数据:

SQL> create table foo (bar varchar2(8));

Table created.

SQL> insert into foo        
  2  select lpad(to_char(level),level)
  3    from dual 
  4    connect by level <=8;

8 rows created.

SQL> commit;

Commit complete.

SQL> select bar,dump(bar) from foo;

BAR
--------
DUMP(BAR)
--------------------------------------------------------------------------------
1
Typ=1 Len=1: 49

 2
Typ=1 Len=2: 32,50

  3
Typ=1 Len=3: 32,32,51

   4
Typ=1 Len=4: 32,32,32,52

    5
Typ=1 Len=5: 32,32,32,32,53

     6
Typ=1 Len=6: 32,32,32,32,32,54

      7
Typ=1 Len=7: 32,32,32,32,32,32,55

       8
Typ=1 Len=8: 32,32,32,32,32,32,32,56


8 rows selected.

SQL> alter table foo modify (bar varchar2(16));

Table altered.

SQL> select bar,dump(bar) from foo;

BAR
----------------
DUMP(BAR)
--------------------------------------------------------------------------------
1
Typ=1 Len=1: 49

 2
Typ=1 Len=2: 32,50

  3
Typ=1 Len=3: 32,32,51

   4
Typ=1 Len=4: 32,32,32,52

    5
Typ=1 Len=5: 32,32,32,32,53

     6
Typ=1 Len=6: 32,32,32,32,32,54

      7
Typ=1 Len=7: 32,32,32,32,32,32,55

       8
Typ=1 Len=8: 32,32,32,32,32,32,32,56

答案 1 :(得分:2)

您正在执行的命令是正确的。

你确定你看到的其他角色还没有出现吗?

答案 2 :(得分:0)

如果没有其他方法可以帮助您,您可以随时执行以下操作:

  1. 添加一个新名称
  2. 的新列
  3. 使用UPDATE
  4. 将旧列中的值复制到新列
  5. 删除旧列
  6. 将新列重命名为旧列名称
  7. 这是漫长而笨拙和蛮力的,但如果你不能以任何其他方式完成它,它将起作用......

答案 3 :(得分:0)

大多赞同Dave Costa。 可能有一个缓存仍然认为数据是旧的'8'大小。 当你说“一些不是全部”值得到额外的\ 0时,一致的因素是什么? 它们是否都是相同的长度(例如七个或八个字符),或者在ALTER列完成时或在某些srver重启之前插入它们?

没有解决方案,但几天之前提出了类似的问题here。也许尝试比较笔记。