2

わかりました。約100行のsqliteデータベースがあります。私がやろうとしているのはちょっと奇妙なことですが、既存の各行の間に新しい行を挿入する必要があります。

私は次のようにInsertステートメントを使用しようとしましたが、運がありませんでした。

insert into t1(column1) values("hello") where id%2 == 0

したがって、基本的には、%演算子を使用して、IDが偶数か奇数かを教えてくれます。偶数ID番号ごとに、新しい行を挿入したいと思います。

私は何が欠けていますか?何が違うのですか?新しい行を1行おきに挿入し、インデックスも更新するにはどうすればよいですか?

ありがとう

4

2 に答える 2

2

あなたの質問は、行に何らかの組み込みの順序があり、他の行の間に行を挿入できることを前提としています。それは真実ではない。

行にはディスク上で順序があり、列は通常順番に割り当てられることは事実ですが、それはid実装の詳細です。クエリを実行すると、ORDER BY句で必要なものを指定しない限り、データベースは選択した任意の順序で行を自由に返すことができます。

ここで、本当に必要なのは、既存の行の間に行をid順番に挿入することだと思います。必要なものを取得する1つの方法は、次のようになります。

UPDATE t1 SET id = id * 2
INSERT INTO t1 (id, column) SELECT id+1, "hello" FROM t1

これUPDATEにより、既存のすべての行のIDが2倍になります(したがって、1,2,3は2,4,6になります)。次に、INSERTはt1でクエリを実行し、その結果を使用してid、既存の行より1つ多い値を持つ新しい行のセットを挿入します(したがって、2,4,6は3,5,7になります)。

上記のステートメントをテストしていないので、1つのステートメントで同じテーブルをクエリおよび更新しているため、それらが機能するかどうか、または追加のトリック(一時テーブルなど)が必要かどうかはわかりません。また、構文エラーが発生した可能性があります。

于 2011-06-30T00:11:01.710 に答える
0

データベースで行が事前に注文されているとは見なさないでください。データベースは、それらが入ってくるとき、またはインデックスに従ってそれらを保存します。必要に応じて、取得時(つまり、データをクエリするとき)にそれらを注文するのはあなたの仕事です。

于 2011-06-30T00:05:25.233 に答える