0

このようなmysqlテーブルがあるとします

id, userid, days, start, and close

そして、このような各列のデータがあります-

1, 3, mon, 01.00, 02.00,
2, 3, tue, 03.00, 05.00,
3, 3, wed, 04.00, 06.00,
4, 3, thu, 05.00, 07.00,
5, 3, fri, 06.00, 08.00,
6, 3, sat, 07.00, 10.00,
7, 3, sun, 08.00, 12.00,

このデータを使用して、テーブルを更新または挿入する必要があります。(ユーザーIDがテーブルに存在しない場合は挿入するか、ユーザーIDがデータベースに存在する場合は更新する必要があります。)

これに対して mysql の単一クエリを作成する方法はありますか? そこで試してみましたINSERT ... ON DUPLICATE KEY UPDATEが、単一の行しか編集できません。つまり、を使用して複数の行でテーブルを挿入または更新することはできませんINSERT ... ON DUPLICATE KEY UPDATE

現時点では、挿入と更新に2つの異なるクエリを使用しています

これは私の挿入クエリです -

$q = "INSERT INTO availability (userid, days, opentime, closetime) 
        VALUES (?, 'Monday', ?, ?),
                 (?, 'Tuesday', ?, ?),
                 (?, 'Wednesday', ?, ?),
                 (?, 'Thursday', ?, ?),
                 (?, 'Friday', ?, ?),       
                 (?, 'Saturday', ?, ?),                         
                 (?, 'Sunday', ?, ?)";                          
            $stmt = mysqli_prepare($dbc, $q);
            mysqli_stmt_bind_param($stmt, 'issississississississ', 
                                            $userId, $monOpen, $monClose, 
                                            $userId, $tueOpen, $tueClose,
                                            $userId, $wedOpen, $wedClose,
                                            $userId, $thuOpen, $thuClose,
                                            $userId, $friOpen, $friClose,
                                            $userId, $satOpen, $satClose,
                                            $userId, $sunOpen, $sunClose);                          
            // Execute the query:
            mysqli_stmt_execute($stmt);
4

2 に答える 2

1

に一意のインデックスを追加する場合(userid, days):

-- run this only once
ALTER TABLE  availability 
  ADD UNIQUE INDEX userid_days_UQ         -- just a name for the index
    (userid, days) ;

ON DUPLICATE KEY UPDATE次に、構文を使用できます。

$q = "
      INSERT INTO availability 
          (userid, days, opentime, closetime) 
      VALUES 
          (?, 'Monday', ?, ?),
          (?, 'Tuesday', ?, ?),
          (?, 'Wednesday', ?, ?),
          (?, 'Thursday', ?, ?),
          (?, 'Friday', ?, ?),       
          (?, 'Saturday', ?, ?),                         
          (?, 'Sunday', ?, ?)
      ON DUPLICATE KEY UPDATE
          opentime = VALUES(opentime),
          closetime = VALUES(closetime) ;
     "; 
于 2013-09-06T06:44:28.027 に答える
1

個別のクエリを使用することは非常に一般的な方法であり、何も問題はありません。ただし、少なくとも mySQL は次のreplace intoコマンドを提供します。

REPLACE INTO availability
    (userid, days, opentime, closetime) VALUES
    (?,    'Monday', ?,         ?);

唯一の欠点は、where 句を指定できないことです。

https://stackoverflow.com/a/3046980/1596455も参照してください。

于 2013-09-06T06:38:29.747 に答える