2013-11-20 3 views
0

Мне нужно добавить новую строку в таблицу в Oracle. Проблема в том, что таблица имеет 50 столбцов, и я действительно не хочу писать их все для инструкции INSERT. Я попытался сделать инструкцию SELECT INTO для дублирования строки, а затем изменить поля, которые меня волнуют по отдельности, но это приводит к УНИКАЛЬНОму нарушению первичного ключа. Поэтому я действительно хочу объявить переменную, содержащую одну строку без, назвав все столбцы, изменив поле первичного ключа, а затем вставим эту переменную. Как?Вставить строку в таблицу SQL на основе существующей строки

+2

Вы не можете 'SELECT *' sinse поля, которые 'UNIQUE' должны быть изменены для того, чтобы работать. Вам нужно будет указать выбранное поле и предоставить информацию, которая будет вставлена ​​в другие, которые не реплицируются. Если 'UNIQUE' также является' AUTO_INCREMENT', используйте значение 'NULL', чтобы завершить его автоматически. – Havenard

+0

@Havenard - Oracle не использует 'AUTO_INCREMENT'; это синтаксис MySQL. Чтобы получить инкрементные значения в Oracle, вам нужно использовать последовательность. – MT0

ответ

2

Вы можете использовать %ROWTYPE в анонимном блоке PL/SQL, чтобы объявить запись, представляющую строку из таблицы, а затем выбрать строку в этой записи и изменить первичный ключ и вставить обновленную запись. Вы даже можете повторно использовать его для нескольких вставок:

DECLARE 
    rec SOME_TABLE%ROWTYPE; 
BEGIN 
    SELECT * 
    INTO rec 
    FROM SOME_TABLE 
    WHERE A = 1; -- Primary Key 

    rec.A := 2; -- Change the primary key value. 
    INSERT INTO SOME_TABLE VALUES rec; 

    rec.A := 3; -- Change the primary key again. 
    INSERT INTO SOME_TABLE VALUES rec; 

    FOR i IN 4 .. 9 LOOP 
    rec.A := i; -- Change it repeatedly... 
    INSERT INTO SOME_TABLE VALUES rec; 
    END LOOP; 

    FOR i IN 1 .. 3 LOOP 
    rec.A := SOME_SEQUENCE.NEXTVAL; -- Or you can manage the primary key's value using a sequence. 
    INSERT INTO SOME_TABLE VALUES rec; 
    END LOOP; 
END; 
/

SQLFIDDLE

+0

Это супер круто, спасибо! – MrEff

0

Я часто хотел сделать что-то похожее на это, но это просто невозможно в любом SQL-варианте, о котором я знаю. Вы не можете запрашивать только некоторые из столбцов в таблице, не указывая их явно (или, возможно, заранее определяя их).

Единственный ярлык я могу предложить, чтобы сбросить список имен столбцов в удобном месте, а затем просто скопировать его в операторе вставки, изменяя только значение, которое нужно:

insert into foo (select 'newC1' as c1, c2, c3, c4, ..., c50 from foo where bar='baz'); 

:: редактировать: : На самом деле, я делаю это так часто, что написал сценарий Python, чтобы помочь мне. Я рассказываю, какую таблицу я редактирую, какое-то предложение where, которое соответствует точно 1 строке, списку столбцов, которые я хочу изменить, и списку новых значений, которые я хочу в этих столбцах. Затем он делает все остальное.

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