3

私が使用してきたINSERT構文はこれです

INSERT INTO TableName VALUES (...)

私が使用してきたUPDATE構文は

UPDATE TableName SET ColumnName=Value WHERE ...

したがって、すべてのコードで、次のような結果になる 2 つの文字列を生成する必要があります。

insertStr = "(27, 'John Brown', 102)";
updateStr = "ID=27, Name='John Brown', ItemID=102";

そして、それらを別々に使用します

"UPDATE TableName SET " + updateStr + " WHERE ID=27 " +
"IF @@ROWCOUNT=0 "+
"INSERT INTO TableName VALUES (" + insertStr + ")"

30 列ほどのテーブルを扱っていると、気になり始めます。

INSERT と UPDATE の両方で使用する文字列を 1 つだけ生成することはできませんか?

例えば。上記の UPDATE ステートメントで insertStr を使用するか、INSERT ステートメントで updateStr を使用するか、まったく新しい方法ですか?

4

7 に答える 7

7

まったく新しいアプローチが必要だと思います。あなたはSQL インジェクションに対して無防備です。データ入力を取得し、ステートメントをデータベースに送信する方法に関するサンプル コードを提供してください。 代替テキスト http://goose.ycp.edu/~weddins/440/S09%20IFS440%20Bobby%20Drop%20Tables.PNG

于 2009-04-26T05:01:01.163 に答える
6

私の知る限り、あなたが説明していることは、ANSI SQL、または私が知っているその拡張では不可能です。ただし、私はほとんど MySQL に精通しており、使用している RDBMS に完全に依存している可能性があります。たとえば、MySQL には「INSERT ... ON DUPLICATE KEY UPDATE ...」という構文があり、そこに投稿したものと似ており、INSERT クエリと UPDATE クエリを組み合わせています。利点は、2 つの可能な操作を 1 つのクエリに結合していることですが、クエリの INSERT 部分と UPDATE 部分は明らかに異なります。

一般に、この種のものは、アプリケーションの ORM レイヤーで抽象化できます。生のSQLに関する限り、あなたが説明した方法で機能する構文に興味があります。

于 2009-04-26T05:05:50.433 に答える
2

一部のDBMSにはこれを行うための拡張機能がありますが、それを行うための関数を提供してみませんか?私たちは実際にこれを以前に行ったことがあります。

使用している言語はわかりませんが、おそらく次のようなものを記述できる連想配列があります。

pk{"ID"}   = "27"
val{"Name"} = "'John Brown'"
val{"ItemID"} = "102"
upsert ("MyTable", pk, val)

また、連想配列がない場合は、複数の整数ベースの文字列配列でそれらをエミュレートできます。

このupsert()関数では、文字列を作成し(失敗しupdateinsert場合はupdate)、DBMSに渡しました。更新ステートメントの作成が非常に簡単になったため、主キーを他のフィールドから分離しました(主キーの列はwhere句に配置され、他の列は設定されただけです)。

上記の呼び出しの結果は、次のSQLになります(失敗の別のチェックがありましたupdateが、この例ではあなたを入れました@@rowcount):

update MyTable set
    Name = 'John Brown',
    ItemID = 102
    where ID = 27
if @@rowcount=0
    insert into MyTable (ID, Name, ItemID) values (
        27,
        'John Brown',
        102
    )

それは私たちにとってうまくいった1つの解決策です。他にも間違いありません。

于 2009-04-26T05:45:53.833 に答える
2

さて、ノーステートメントはどうですか?これを処理するためにORMを調べたいと思うかもしれません...

于 2009-04-26T05:08:44.250 に答える
1

SQL Server 2008:

MERGE dbo.MyTable AS T
USING
 (SELECT  
  @mykey AS MyKey
  @myval AS MyVal
  ) AS S

ON (T.MyKey = S.MyKey)

WHEN MATCHED THEN 
  UPDATE  SET 
    T.MyVal = S.MyVal
WHEN NOT MATCHED THEN
  INSERT (MyKey, MyVal)
  VALUES (S.MyKey, S.MyVal)

MySQL:

INSERT (MyKey, MyVal)
INTO MyTable
VALUES({$myKey}, {$myVal})
ON DUPLICATE KEY UPDATE myVal = {$myVal}
于 2009-04-26T07:12:43.720 に答える
1

一部のデータベースには、まさにこれを行う独自の拡張機能があります。

INSERT と UPDATE の構文をもっと一貫性のあるものにできることには同意しますが、これは現在の現実であり、今後も変更されることはありません。多くのシナリオでは、最善の選択肢は「まったく新しい方法」です。オブジェクト リレーショナル マッピング ライブラリ (または .NET DataSets のような弱いティー レイヤー) を使用して違いを抽象化し、低レベルの SQL について心配するのをやめます。構文。もちろん、すべてのアプリケーションで実行可能なオプションではありませんが、オブジェクトを構築または更新し、Save メソッドを呼び出して、ライブラリに SQL 構文を理解させることができます。

于 2009-04-26T05:03:32.420 に答える
1

考えてみれば、INSERT と UPDATE はまったく同じものです。UPDATE にフィルターがある場合を除いて、フィールド名を値にマップします。キーがフィールド名で、値がフィールドに割り当てたい値である連想配列を作成することにより、マッピングができます。INSERT または UPDATE に応じて、適切な文字列形式に変換するだけです。指定されたパラメーターに基づいて変換を処理する関数を作成するだけです。

于 2009-04-26T05:36:10.143 に答える