ORA-00947 - недостаточно значений: происходит на одном сервере, но не на другом
Я работаю над проектом, который должен добавить один столбец к существующей таблице. Это так:
СТАРЫЙ Макет 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;
Есть ли какой-нибудь вариант оракула, может вызвать такую разницу в оракуле?
2 ответа
ORA-00947: недостаточно значений
это ошибка, которую вы получили, что означает, что ваша таблица на самом деле имеет больше столбцов, чем вы указали в INSERT
,
Возможно, вы не добавили столбец ни на одном из серверов.
Существует также другой синтаксис для INSERT
, который является более читабельным. Здесь вы также упоминаете имена столбцов. Таким образом, когда такой SQL выдается, если NOT NULL
столбец пропущен, INSERT
все еще работаю, имея null
обновлено в пропущенных столбцах.
INSERT INTO TABLE1
(COLUMN1,
COLUMN2)
SELECT
COLUMN1,
COLUMN2
FROM
TABLE2
insert into NewTbl select
column1,
column2
from OldTbl;
Вышеприведенный запрос неверен, потому что ваша новая таблица имеет три столбца, однако, ваш выбор имеет только два столбца в списке. Если бы число и порядок столбцов были одинаковыми, то вы могли бы достичь этого.
Если количество столбцов и порядок столбцов различны, необходимо явно перечислить имена столбцов в правильном порядке.
Я бы предпочел CTAS(создать таблицу как select), это было бы быстрее, чем вставка.
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).