2

MS SQL Server、MySQL、およびOracleと通信するDBレイヤーを作成しています。特定のデータが含まれている場合は既存の行を更新できる操作が必要です。それ以外の場合は、新しい行を挿入します。オールインワンのSQL操作。

基本的に、既存のデータが存在する場合はそれを上書き保存する必要があり、存在しない場合は追加する必要があります

概念的には、これはupsertと同じですが、1つのテーブルでのみ機能する必要がある点が異なります。パフォーマンスに影響するため、削除してから挿入する必要がないことを確認しようとしています。

これを行うための汎用SQLはありますか、それともベンダー固有のソリューションが必要ですか?

ありがとう。

4

4 に答える 4

3

MySQL は (MS や Oracle とは異なり) サポートしていないため、ベンダー固有の SQL が必要です。MERGE

http://en.wikipedia.org/wiki/Merge_(SQL )

遅かれ早かれ、DB レイヤーのベンダー固有の実装が必要になると思います。SQL の移植性は、少しでも高度なことを行うとすぐに神話になります。

于 2012-09-21T10:54:56.383 に答える
1

これはベンダー固有のものになると確信しています。SQL Server の場合、MERGEステートメントを使用してこれを実現できます。

于 2012-09-21T10:55:11.067 に答える
1

SQL Server 2008 を使用している場合は、Merge ステートメントを使用します。ただし、Insert パーツに何らかの条件が含まれている場合は使用できないことに注意してください。その場合、これを達成するための独自の方法を作成する必要があります。そして、あなたの場合、Merge ステートメントを持たない MySQL を使用しているため、そうする必要があります。

この目的で ORM レイヤー (Entity Framework など) を使用しないのはなぜですか?

いくつかの疑似コード (C#)

public int SaveTask(tblTaskActivity task, bool isInsert)
        {
            int result = 0;

            using (var tmsEntities = new TMSEntities())
            {

                if (isInsert) //for insert
                {
                    tmsEntities.AddTotblTaskActivities(task);
                    result =  tmsEntities.SaveChanges();
                }
                else //for update
                {
                    var taskActivity = tmsEntities.tblTaskActivities.Where(i => i.TaskID == task.TaskID).FirstOrDefault();
                    taskActivity.Priority = task.Priority;
                    taskActivity.ActualTime = task.ActualTime;
                    result = tmsEntities.SaveChanges();
                }
            }
            return result;
        }
于 2012-09-21T10:58:11.503 に答える
0

MySQL では、マージに似たものがあります。

insert ... on duplicate key update ...

MySQL リファレンス - 重複キー更新時に挿入

于 2012-09-26T21:34:15.500 に答える