2009-04-26 12 views
3

INSERT構文は、私が使用してきたこのSQL:INSERTとUPDATEの両方に同じ文字列を使用しますか?私が使用してきた

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"; 

のようなものになり、その後、別途

01をそれらを使用します

私は30列のようなテーブルを使って作業していると、気になります。

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

例えば、上記のinsertStrをUPDATE文またはINSERT文のupdateStrで使用するか、まったく新しい方法ですか?

答えて

2

一部のDBMSにはこれを行う拡張機能がありますが、それを行うための機能を提供しないのはなぜですか?私たちはこれまでにこれを実践してきました。それは連想配列を持っていない場合、あなたがそれらをエミュレートすることができ、

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

と:

は、私はあなたが使用しているどのような言語はよく分からないが、あなたのようなものを書いたことができる場所、それはおそらく、連想配列を持っています複数の整数ベースの文字列配列を使用します。私たちのupsert()機能で

は、私たちは(updateが失敗した場合update、その後、insert)文字列を構築し、私たちのDBMSにそれを渡されました。更新ステートメントの作成が非常に簡単になったため(プライマリキー列はwhere句に入り、他の列は設定されていたため)、プライマリキーを他のフィールドと区別して保存しました。

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 
    ) 

働いていた一つの解決策だ:

上記の呼び出しの結果は、以下のSQL(私たちはのためのさまざまなチェックがupdateを失敗していたが、私はこの例では、あなたの@@rowcountを入れている)ことになりますよく私たちのために。間違いなく他の人がいる。

7

私は全く新しいアプローチが必要だと思います。あなたはSQL Injectionに開かれています。どのようにデータ入力を受け取り、ステートメントをデータベースに送るかに関するサンプルコードを提供してください。 alt text http://goose.ycp.edu/~weddins/440/S09%20IFS440%20Bobby%20Drop%20Tables.PNG

+2

私は同意するものとします。これがプロダクションコードの場合は、少なくともパラメータ化された文を使用する必要があります。どの言語を使用しているか教えてください。オブジェクトの永続性のような優れたアプローチを考え出すことができます。 –

+0

これはどのように関連していますか?問題は、2つのステートメントで動作する文字列を作成することです。 – womp

+4

より良いプログラミング方法を学ぶことは常に関連しています。 –

1

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

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

6

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

一般的に、この種のものは、アプリケーション内のORMレイヤーで抽象化することができます。限り、生のSQLが行く限り、私はあなたが記述する方法で動作する任意の構文に興味があるだろう。

2

さて、文はありませんか?

1

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

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} 
関連する問題