1

SQLite をクエリする方法がわかりません。必要: 1) 条件 (新しいフィールド エントリと古いフィールド エントリの比較) の場合、レコード (主キー) を置き換えます。2) 主キーのデータベースにそのようなエントリが存在しない場合は、エントリを挿入します。

重要なのは、非常に高速に動作する必要があることです。有効な調査が思いつかない。

編集。

MyInsertRequest - 目的の式。

脚本:

CREATE TABLE testtable (a INT PRIMARY KEY, b INT, c INT)

INSERT INTO testtable VALUES (1, 2, 3)

select * from testtable
1|2|3

-- Adds an entry, because the primary key is not
++ MyInsertRequest VALUES (2, 2, 3) {if c>4 then replace}

select * from testtable
1|2|3
2|2|3

-- Adds
++ MyInsertRequest VALUES (3, 8, 3) {if c>4 then replace}

select * from testtable
1|2|3
2|2|3
3|8|3

-- Does nothing, because such a record (from primary key field 'a') 
-- is in the database and none c>4
++ MyInsertRequest VALUES (1, 2, 3) {if c>4 then replace}

select * from testtable
1|2|3
2|2|3
3|8|3

-- Does nothing
++ MyInsertRequest VALUES (3, 34, 3) {if c>4 then replace}

select * from testtable
1|2|3
2|2|3
3|8|3

-- replace, because such a record (from primary key field 'a') 
-- is in the database and c>2
++ MyInsertRequest VALUES (3, 34, 1) {if c>2 then replace}

select * from testtable
1|2|3
2|2|3
3|34|1
4

3 に答える 3

0

要件が次のとおりであると仮定します。

  • a存在しない場合は新しい行を挿入します。
  • a存在し、既存cが new よりも大きい場合、行を置き換えcます。
  • a存在し、既存がc新しいより小さいか等しい場合は何もしませんc

INSERT OR REPLACE最初の 2 つの要件に適合します。

最後の要件については、INSERT無効にする唯一の方法は、空の行セットを提供することです。

次のような SQLite コマンドで作業が完了します。

INSERT OR REPLACE INTO sometable SELECT newdata.* FROM
    (SELECT 3 AS a, 2 AS b, 1 AS c) AS newdata
    LEFT JOIN sometable ON newdata.a=sometable.a
    WHERE newdata.c<sometable.c OR sometable.a IS NULL;

新しいデータ (3,2,1この例では) はLEFT JOIN、現在のテーブル データに含まれています。

次に、 newが existing よりも小さくないWHERE場合に行を「選択解除」し、行が新しい場合、つまり.ccsometable.* IS NULL

于 2013-08-29T11:11:08.730 に答える