質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

データベース

データベースとは、データの集合体を指します。また、そのデータの集合体の共用を可能にするシステムの意味を含めます

Q&A

解決済

3回答

1002閲覧

SQLのUPDATE文

tr_09

総合スコア44

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

データベース

データベースとは、データの集合体を指します。また、そのデータの集合体の共用を可能にするシステムの意味を含めます

0グッド

0クリップ

投稿2020/09/16 03:14

編集2020/09/16 03:43

目的:複数行の更新を一括で行いたい(トータルで20,000行程度)
MySQL(Ver 14.14)を使用しております。

基本的なupdate文を見ると、カラム名や値を指定してupdateしていますが、
複数行の場合、insert文のように(値1、値2、値3)という記述で複数行更新することは可能なのでしょうか?

色々なサイトをみてみましたが、量が多い場合のupdate文で効率よく記述する方法はありますか?


例)

|id|title|content|data
|:--|:--:|--:|
|1|りんご|赤い|2020/11/11
|2|れもん|すっぱい|2020/11/20
|3|もも|甘い|2020/11/30

このようなデータを下記のように値変更を、一括で行いたいです。

|id|title|content|data
|:--|:--:|--:|
|1|ぶどう|むらさき|2020/10/11
|2|いちご|あかい|2020/12/20
|3|ばなな|黄色い|2020/10/30


参考にしたサイト
https://www.atmarkit.co.jp/ait/articles/1210/23/news008_2.html
https://teratail.com/questions/188661

case等を使うと、カラム指定と値指定を1回1回行わなければいけないので、
insert文のように、最初に変更したいカラム名を指定して、そのあとで値だけを指定したいのですが
そういった記述方法は可能なのでしょうか…?

調べても分からずでしたので、お力添えいただきたいです。よろしくお願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

aokikenichi

2020/09/16 03:26

例示を見ますと該当する全データ総とっかえのようですので ・不要行をDELTEで削除 ・追加行をINSERTで追加 が一番早いと思いますが、あえてUPDATEする必要は何かあるのでしょうか。
tr_09

2020/09/16 03:29

コメントありがとうございます。 例が悪すぎました…。約2万行あるうちの1万行程度のものを更新したくてでして… そうなるとどうするのが一番効率よく更新作業が行えるのかというところでつまづいております…
yambejp

2020/09/16 03:29

SQLの種類はなんでしょう?
tr_09

2020/09/16 03:31

知識不足で申し訳ありません。SQLの種類とは…どういうことでしょうか?
yambejp

2020/09/16 03:32

たとえばOracle、MySQL、PostgreSQL、SQL Server(MS)などが有名です
tr_09

2020/09/16 03:33

ありがとうございます。MySQLを使用しております。
m.ts10806

2020/09/16 03:38

>MySQLを使用しております。 タグに追加し、バージョンも質問本文に記載してください。
tr_09

2020/09/16 03:43

修正いたしました。ご指摘ありがとうございます。
aokikenichi

2020/09/16 03:51

「約2万行あるうちの1万行程度のものを更新したくてでして…」 この作業は頻繁にあるのでしょうか? そうでないのであればその1万行を削除して、UPDATEしない内容でINSERTすればよろしいのかなと思います。 頻繁にあるのであれば全データの約半分が毎回更新とのことですとテーブル構造から見直して法がよいのかなと思います。
tr_09

2020/09/16 03:53

いえ!一度のみの作業となります。 削除して入れ直す方法も視野に入れておきます。 ありがとうございます!
guest

回答3

0

ベストアンサー

例を見る限りidを元に、その他のカラムをすべて更新する感じなので
deleteしてinsertするのが一番効率的だと思います。

投稿2020/09/16 03:30

yambejp

総合スコア114829

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

tr_09

2020/09/16 03:33

一括で行うのは厳しそうですよね…ありがとうございます。
yambejp

2020/09/16 03:34

SQLの種類によっては書き方があります。 でも効率的かどうかは別問題です
yambejp

2020/09/16 03:42

//sample create table tbl(id int primary key,title varchar(10), content varchar(10),data date); insert into tbl values (1,'りんご','赤い','2020-11-11'), (2,'れもん','すっぱい','2020-11-20'), (3,'もも','甘い','2020-11-30');
yambejp

2020/09/16 03:42

//update UPDATE tbl set title=COALESCE(ELT(FIELD(id,1,2,3),'ぶどう','いちご','ばなな'),title), content=COALESCE(ELT(FIELD(id,1,2,3),'むらさき','あかい','黄色い'),content), data=COALESCE(ELT(FIELD(id,1,2,3),'2020-10-11','2020-12-20','2020-10-30'),data)
yambejp

2020/09/16 03:48

//もしくは、テンポラリテーブルを作って流し込む create temporary table tmp(id int primary key,title varchar(10),content varchar(10),data date); insert into tmp values (1,'ぶどう','むらさき','2020-10-11'), (2,'いちご','あかい','2020-12-20'), (3,'ばなな','黄色い','2020-10-30'); update tbl as t1,tmp as t2 set t1.title=t2.title, t1.content=t2.content, t1.data=t2.data where t1.id=t2.id
yambejp

2020/09/16 03:50 編集

//全項目更新しているなら上記tmpをつかってreplace構文でもよいかも replace tbl select * from tmp;
tr_09

2020/09/16 03:50

データが少量ですと、上記の記述が便利だな〜とは思うのですが、避けては通れぬ道ですね…! idごとに横並びにしたデータは持っていたので、なんとかそのまま更新処理できないかなと思っていたのですが、難しそうでした… 丁寧なご回答ありがとうございます。
tr_09

2020/09/16 03:51

テンポラリテーブル…初めて聞きました。 調べつつ、もう一度方法を改めてみたいと思います。 上記コード参考にさせていただきます!!
yambejp

2020/09/16 03:52

mysqlのreplace構文は特殊で、実際には該当するデータを削除して、 新たにインサートしています
tr_09

2020/09/16 03:55

なるほど…replace構文、言葉は聞いたことあったのですが詳しくは知らなかったので、これを機に調べてみます!
guest

0

UPDATE文はWHERE句にヒットしたレコードを更新します。
例として提示されたケースだと、

SQL

1WHERE id=1

のようにWHERE句でキーを指定したUPDATE文を20000行書くしかないと思います。
私だったらExcelのワークシートに更新後の値を設定して、マクロで更新処理を書きます。

投稿2020/09/16 03:28

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

tr_09

2020/09/16 03:34

マクロ…!承知しました。ありがとうございます。 マクロでの更新処理について調べてみようと思います。
guest

0

case等を使うと、カラム指定と値指定を1回1回行わなければいけないので、
insert文のように、最初に変更したいカラム名を指定して、そのあとで値だけを指定したい

更新のバリエーションがあるんですから、そのバリエーション分の分岐は必要です。
sqlのみで行うならcase等での分岐ですけど、SQL文にその分岐を持ち込みたくないなら、データで行う必要があります。

更新先と更新値のテーブルを結合してupdateすれば、SQL文に分岐は必要なくなります。
当然ですが、更新値のデータはバリエーション分作成する必要があります。

質問のケースが、更新データが大量にあってそれを元に更新したいという事なら、そのデータを作業用のテーブルにLOAD DATA INFILE等でインポートして、そのテーブルを元に更新するのが手間が掛からないと思います。

投稿2020/09/16 03:38

編集2020/09/16 03:46
sazi

総合スコア25188

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

tr_09

2020/09/16 03:48

詳しいご回答ありがとうございます。 作業用テーブルを作成する方法もあるのですね… やはり一括で行うというのは難しそうですね… ありがとうございます!
tr_09

2020/09/16 04:00

難しくて読み飛ばしていた記事でした…笑 ありがとうございます!!じっくり読んでみます!!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問