我正在处理一个必须在存在的表中添加一列的项目。 就像这样:
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中造成这种差异?
答案 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)。