2

これの例を探していましたが、どうやら私は答えを見つけるのに十分な用語をよく知りません:

PHP / MySqlを利用して、そのデータの一部を編集しながら、テーブル内のレコードを複製しようとしています。

次のような既存のテーブル「情報」があります。

1 ID - Int11 AutoIncrement

2 elementID - Int11 Unique

3 text - text utf8

4 loopID - Int11

5 created - datetime

6 modified - datetime

'elementID'フィールドと'loopID'フィールドの両方に、最後の4桁が埋め込まれた識別子(この場合はシステムの'ページ')を表す値が含まれています。したがって、たとえば:

ページ「9000」elementIDは次のように記録されます

100019000
100029000
100039000

およびページ「9000」loopIDは次のように記録されます

1009000
1019000
1029000

ページ「9001」elementIDのレコードは次のように記録されます

100019001
100029001
100039001

およびページ「9001」loopIDのレコードは次のように記録されます

1009001
1019001
1029001

うまくいけば、あなたはアイデアを得るでしょう。

私がやりたいのは、新しいページが作成されたとき(この場合は9002)、エンドユーザーは前のページのすべてのレコードデータを複製することを選択できます(この場合は9001を複製したい)。

これに飛び込む前に、私は本当に最良の方法が何であるかを理解する必要があります。

最初は、9001に一致するすべてのレコードを配列にクエリし、elementIDとループの最後の4桁の9001をすべて9002に置き換え、「作成」と「変更」の日付を今日に置き換えてから、次のように記述したいと考えていました。結果の配列は新しいエントリとしてデータベースに戻されますか?もしそうなら、どの時点で、クエリ中、またはデータベースへの書き戻し中に置換を行う必要がありますか?

それから私がさらに考え始めたので、これが代わりにこれと同様の方法で行われるべきかどうか疑問に思うようになりました:

INSERT INTO information...
SELECT REPLACE... 
FROM information
[WHERE ..]

これには十分な要素が含まれているので、私のようなデータベースアマチュアにとっては簡単に生成できません...誰かがこのプロセスの適切な例を教えてくれれば、それは大きな助けになります。

4

2 に答える 2

0

の線に沿った何か

declare newId int;
declare copyFromId int;
declare diff int;

set newId := 9002;
set copyFromId := 9001;
setdiff := newId - copyFromId; -- in this case it will be 1

select into your_table 
  select null,
         elementID + diff, -- so for 100019000 it will be 100019001
         text,
         loopID + diff, -- same as above
         now(),
         now()         
    from your_table
   where elementID mod 10000 = copyFromId; -- all lines with en elementId ending in copyFromId
于 2012-12-09T08:34:47.780 に答える
0

私はあなたの最初のアイデアが一緒に行くものだと思います。

コピーするすべてのレコードをデータベースから取り出し、データに変更を加えた後、データベースでクエリを実行してこれらを追加し直します。10,000のクエリを実行する必要がない限り、これは非常に高速です。

SQLステートメント自体でこれを行うことは非常に複雑であり、必要ありません。おそらくストアドプロシージャとして可能ですが、それを使用するのに最適な場所はあなたのphpです。

于 2012-12-09T08:37:22.807 に答える