1

我正在从事一个必须在现有表中添加一列的项目。它是这样的:

旧 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 服务器上,我得到“ORA-00947 错误:没有足够的值”

insert into NewTbl select
column1,
column2
from OldTbl;

是否有任何 oracle 选项可能导致 oracle 出现这种差异?

4

2 回答 2

1

ORA-00947: 值不足

这是您收到的错误,这意味着您的表实际上包含的列数比您在INSERT.

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

也有不同的语法INSERT更具可读性。在这里,您还提到了列名。因此,当发出这样的 SQL 时,除非NOT NULL错过了列,否则INSERT仍然可以工作,null在错过的列中进行了更新。

INSERT INTO TABLE1
(COLUMN1,
 COLUMN2)
SELECT
COLUMN1,
 COLUMN2
 FROM
 TABLE2
于 2015-10-07T06:02:50.967 回答
0
insert into NewTbl select
column1,
column2
from OldTbl;

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

如果列的数量和列顺序不同,那么您必须以正确的顺序明确列出列名。

我更喜欢CTAS (create table as select) 在这里,它会比插入更快。

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

您可以使用NOLOGGINGPARALLEL来提高性能。

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

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

于 2015-10-07T06:16:37.400 回答