繁体   English   中英

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

[英]how to change a column's attribute without affecting the values already present?

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

我尝试的查询是-修改表SOME_TABLE修改(SOME_COL varchar2(16)); 但是当我运行上面的查询时,表中已经存在的值(有些不是全部)被附加到\\\\ 0后面。

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

怀疑表中的原始数据被更改了。 由于您的某些评论暗示您正在使用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. 使用UPDATE将值从旧列复制到新列
  3. 删除旧列
  4. 将新列重命名为旧列的名称

它既漫长又笨拙,但是如果您无法通过其他任何方式完成它,它将起作用...

大多数人都同意戴夫·科斯塔的观点。 可能会有一个仍然认为数据是旧的“ 8”大小的缓存。 当您说“不是全部”值获得额外的\\ 0时,一致因素是什么? 它们是否都是相同的长度(例如,七个或八个字符),或者在完成ALTER列时或在某些服务器重新启动之前已将它们插入?

没有解决方案,但是几天前在这里提出了类似的建议。 也许尝试比较笔记。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM