ORA-00947 - 没有足够的值:在一个服务器中发生但在另一个服务器中发生

时间:2015-10-07 05:54:54

标签: sql oracle ora-00947

我正在处理一个必须在存在的表中添加一列的项目。 就像这样:

OLD TBL布局

OldTbl(
  column1 number(1) not null,
  column2 number(1) not null 
);

SQL创建新的TBL

create table NewTbl(
  column1 number(1) not null,
  column2 number(1) not null,
  **column3 number(1)**
);

当我尝试通过下面的SQL插入数据时, 在一台oracle服务器上,它被成功执行, 但是在另一个oracle服务器上,我得到了#34; ORA-00947错误:没有足够的值"

insert into NewTbl select
column1,
column2
from OldTbl;

是否有任何oracle选项可能会在oracle中造成这种差异?

2 个答案:

答案 0 :(得分:1)

  

ORA-00947:值不够

这是您收到的错误,这意味着您的表实际上拥有的列数多于您在INSERT中指定的列数。

也许,您没有在任何一个服务器中添加该列。

INSERT还有一个不同的语法,它更具可读性。在这里,您还提到了列名称。因此,在发布此类SQL时,除非错过NOT NULL列,INSERT仍然有效,null在错过的列中更新。

INSERT INTO TABLE1
(COLUMN1,
 COLUMN2)
SELECT
COLUMN1,
 COLUMN2
 FROM
 TABLE2

答案 1 :(得分:0)

insert into NewTbl select
column1,
column2
from OldTbl;

上面的查询是错误的,因为您的新表有三列,但是,您的select只列出了两列。如果列的数量和顺序相同,那么您可以实现它。

如果列数的顺序不同,则必须明确列出正确顺序的列名。

我更喜欢CTAS(在这里创建表格),它会比插入更快。

CREATE TABLE new_tbl AS
SELECT column1, column2, 1 FROM old_tbl;

您可以使用 NOLOGGING PARALLEL 来提高效果。

CREATE TABLE new_tbl NOLOGGING PARALLEL 4 AS
SELECT column1, column2, 1 FROM old_tbl;

这将创建新表将3列,前两列将包含旧表的数据,第三列将为所有行的值为1。您可以根据自己的选择为第三列保留任何值。我将其保留为1,因为您希望第三列为数据类型NUMBER(1)。