2017-02-20 13 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) 

(idフィールドは、私の選択した行を識別し、自動インクリメントフィールドです)。

今、私はテーブルに行を複製することができました。欠けている何 は正しく、次のように「配列」フィールドを更新することです:

  1. 貼り付ける場所では(3)私の行は値3,4,5が含まれている必要があります。
  2. 元の行(seq = 3)が(seq = 6)になり、すべての行が3行下に移動するように、その位置のすべての元の行を3つ増やす必要があります。

これはSQLクエリで実現できますか?

+0

私は一時テーブルにコピーし、次に、my_tableの上書きを更新することでこれに取り組むと思います。このようにして、私は自動インクリメントをつぶすつもりはありません。 –

+0

いいえ、1つのステートメントで挿入と更新を実行することはできません。 –

答えて

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; 

(2、 'B')、(1、 'A')と(配列、名前)を挿入..(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 + 1)、(5 + 2)、(5 + 3)のように計算します。私の場合は – Yaron

+0

で、トリガーの行数がどれほど多いか心配する必要はありません。 – saikumarm

関連する問題