2015-03-03 3 views
0

Итак, у меня есть две таблицы в Oracle. Таблица A является основной таблицей, а таблица B - данными, полученными от подрядчика. Оба они имеют одинаковую общую структуру. В конце концов, я хотел бы INSERT INTO TABLE A(SELECT * FROM TABLE B). Однако столбец первичного ключа в таблице B не существует. Как вы предлагаете создать первичный ключ, который одновременно генерирует последовательность из 4328 и далее для каждой строки в таблице B?Как создать последовательность в oracle сверху вниз

я продолжил делать следующее:

create sequence myseq 
    increment by 1 
    start with 4328 
    MAXVALUE 99999 
    NOCACHE 
    NOCYCLE; 

Затем создал столбец PK, наконец, реализованы следующие:

INSERT INTO TABLE B (PK) VALUES(MYSEQ.nextVal); 

Но никаких результатов не дали, кроме сдачи в одном ряду в самом конце. Я хочу, чтобы каждая строка была заполнена, начиная с 4328 и заканчивая 291 строкой позже.

+0

Ну, да, ваша вставка создаст один ряд. Вам нужно написать скрипт pl/sql для цикла и выполнить несколько вставок. – OldProgrammer

+0

В любом случае вокруг этого? Я использую SQL Developer. – user40720

+0

Вы вставляете новые строки или обновляете новый столбец PK для существующих строк? –

ответ

0

Извините, но я не знаю, решила ли я вашу проблему. Вы хотите вставить одну строку в таблицу A и таблицу B с равным значением PK? Вы можете сделать это с помощью процедуры поставить значение последовательности в переменной перед вставить строки, например:

BEGIN 
    SELECT MYSEQ.nextval INTO v_SEQUENCE FROM dual; 
    insert into table_A values (v_SEQUENCE,1,2,3); 
    insert into table_B values (v_SEQUENCE,1,2,3); 
END; 

Если вы можете получить все строки из TABLE_B и вставить в TABLE_A с ПК вы можете сделать, например:

INSERT INTO TABLE_A (SELECT MYSEQ.nextval, B.* FROM TABLE_B B) 

Не так ли?

+0

Я хочу, чтобы таблица B продолжала последовательность PK из таблицы A, поэтому она была бы бесшовной, когда я импортировал все свои данные из таблицы B в таблицу A. – user40720

+0

@ user40720 - если вы хотите, чтобы она была бесшовной при копировании данных из B в A, почему бы вам не сгенерировать ключ, как вы вставляете, а не заранее? Что произойдет, если новые строки будут вставлены в A тем временем? И как A получает * его * значение PK? –

+0

Как бы я сгенерировал его на лету? – user40720

0

Ваш подход только вызывает последовательность один раз. То, что вы хотите сделать, это выполнить цикл в PL/SQL для вызова последовательность столько раз, сколько необходимо:

BEGIN 
    FOR x IN 1 .. 291 LOOP 
    INSERT INTO TABLE B (PK) VALUES(MYSEQ.nextVal); 
    END LOOP; 
END; 

Убедитесь, что вы падаете и воссоздать вашу последовательность, чтобы убедиться, что он начинается в нужное значение.

Смежные вопросы