2017-02-20 1 views
0

У меня есть таблица, которая содержит много строк, упорядоченных по полю 'seq'. Я выбрал строки 6-9, и я хочу скопировать и вставить их в строку 3, например. Для этого я хотел бы создать запрос SQL, который делает следующее:Копировать - Вставить строки с использованием MySQL INSERT INTO

INSERT INTO my_table (seq, field1, field2....) 
SELECT seq, field1,field2.. 
FROM my_table 
WHERE id IN (234, 233,232) 

(поле идентификатора поле автоматического приращения, которое идентифицирует выбранные мои строки).

Теперь - мне удалось дублировать строки в таблице. Чего не хватает, чтобы правильно обновить поле «Последовательность» следующим образом:

  1. В вставленного месте (3) мои строки должны содержать значения 3,4,5.
  2. Все исходные строки в этом месте должны быть увеличены на 3, чтобы теперь появилась исходная строка (seq = 3) (seq = 6), и все строки перемещаются на 3 строки вниз по таблице.

Возможно ли это с помощью SQL-запроса?

+0

Я думаю, что смогу решить эту проблему, скопировав временную таблицу, а затем обновив переписку my_table. Таким образом, я бы не стал возиться с автоматическим приращением. –

+0

Нет, вы не можете выполнять вставки и обновления в одном выражении. –

ответ

0

Вы можете создать триггер, который проверяет seq, если существует последовательность, он будет обновлять порядковые номера над ним и будет.

create table s_sequence 
(seq number(3), 
name varchar2(2000) 
); 

create or replace trigger s_seq_order 
    before insert on s_sequence 
    for each row 
declare 
    seq_exists varchar2(20); 
begin 
    begin 
    select 1 into seq_exists from s_sequence where seq = :new.seq; 
    exception 
    when NO_DATA_FOUND then 
     null; 
    end; 
    if seq_exists = '1' then 
    update s_sequence set seq = seq + 1 where seq >= :new.seq; 
    end if; 
end; 

вставки (SEQ, имя) с (1, 'A'), (2, 'B') .. (5, 'E')

enter image description here

Теперь вставьте (2, 'F')

enter image description here

Но, я не уверен, что это подходящий способ справиться с порядком. , но зачем поместить какие-либо данные в таблицу?

PS: Этот код протестирован в oracle.

+0

Спасибо за ответ. Я пытаюсь использовать другую стратегию. Работая с «INSERT INTO», я хотел бы вставить мои скопированные строки и вычислить значение «seq» для них на основе количества вставленной строки. Есть ли выражение, которое я мог бы использовать при вставке строки, которая могла бы дать значение каждой строке: 'place_to_insert + number_of_row_in_query'? Например, если я вставляю 3 строки на место 5, я бы хотел, чтобы выражение вычислялось как (5 + 1), (5 + 2), (5 + 3) для каждой строки. – Yaron

+0

в моем случае, вам не нужно беспокоиться о том, сколько триггеров работает подряд. – saikumarm