6

以下に SQL 挿入がありますが、正常に動作しますが、DATE=xxxx、NAME =xxxx、JOB = xxx かどうかを確認し、存在する場合は HOURS を更新し、そうでない場合は新しい行を挿入します。これはSQLで可能ですか?

"INSERT INTO TABLE (NAME, DATE, JOB, HOURS) VALUES ('BOB', '12/01/01', 'PM','30');

以下の OR REPLACE を同じ結果で試すと、毎回新しい行が追加されます。

add_time = conn.prepareStatement("INSERT OR REPLACE INTO RESOURCE (NAME, DATE, JOB, HOURS) VALUES ('"+name+"', '" + date + "', '"+job+"','"+hours+"');");

例えば:

以下がDBにあり、ジョンが自分の時間を更新したい場合、名前、日付、仕事が挿入しようとしている値と同じであり、それらがHOURSのみを更新するかどうかを確認します。それ以外の場合、それらのいずれも一緒に存在しなかった場合 (John は別の DATE または JOB に対して記録された時間を持っている可能性があります)、新しい行を挿入します。

また、他の人も、以下のように同じ DB に時間とさまざまな役割を記録します。

ジョン | ジョン | 2012 年 12 月 12 日 | クリーナー | 20 ジョン | 2012 年 12 月 12 日 | 社長 | 社長 10 ジム | 2011 年 12 月 10 日 | クリーナー | 5

4

2 に答える 2

9

REPLACE INTO次のように使用できます。

REPLACE INTO mytable (NAME, DATE, JOB, HOURS)
VALUES ('BOB', '12/01/01', 'PM','30')

ただし、これを機能させるには、一意のインデックスを作成する必要があります。

CREATE UNIQUE INDEX myindex
ON mytable(NAME, DATE, JOB)

2つの行が同じであると見なされ、挿入されるのではなく置換される必要があるかどうかを判断する一意のインデックスには、このようなフィールドの組み合わせを使用する必要があることに注意してください。

SQLFiddleデモ

一意のインデックスの作成をコメントアウトすると、正しく機能しなくなることに注意してください。

于 2013-02-11T07:20:37.293 に答える
2

これは以前にsqliteについてここで尋ねられたと思います:

存在しない場合は挿入するか、それ以外の場合は更新しますか?

そのための構文があるようです:

INSERT OR REPLACE INTO TABLE (NAME, DATE, JOB, HOURS) VALUES ('BOB', '12/01/01', 'PM','30');
于 2013-02-11T07:18:12.297 に答える